#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
#define BOOST_SPIRIT_UNICODE // We'll use unicode (UTF8) all throughout
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/qi_parse.hpp>
#include <boost/spirit/include/support_standard_wide.hpp>
void parse_simple_string()
{
namespace qi = boost::spirit::qi;
namespace encoding = boost::spirit::unicode;
//namespace stw = boost::spirit::standard_wide;
typedef std::wstring::const_iterator iterator_type;
std::vector<std::wstring> result;
std::wstring const input = LR"(12,3","ab,cd","G,G\"GG","kkk","10,\"0","99987","PPP","你好)";
qi::rule<iterator_type, std::wstring()> key = +(qi::unicode::char_ - qi::lit(L"\",\""));
qi::phrase_parse(input.begin(), input.end(),
key % qi::lit(L"\",\""),
encoding::space,
result);
//std::copy(result.rbegin(), result.rend(), std::ostream_iterator<std::wstring, wchar_t> (std::wcout, L"\n"));
for(auto const &data : result) std::wcout<<data<<std::endl;
}
studierte ich diesen Beitrag How to use Boost Spirit to parse Chinese(unicode utf-16)? und die Führungen folgen, aber nicht die Worte "你好"Wie boost :: spirit verwendet wird, um UTF-8 zu parsen?
die erwarteten Ergebnisse sollten
sein12,3 ab, cd analysieren G, G \ "GG kkk 10, \" 0 PPP 你好
aber die tatsächlichen Ergebnisse sind 12,3 ab, cd G, G \ "GG kkk 10, \" 0 PPP
chinesische Wörter zu analysieren fehlgeschlagen "你好"
OS ist 64bits win7, mein Editor Speichern Sie die Wörter als UTF-8
Ich bin verwirrt. Sie verwenden UTF8? Warum das Wstring dann? (UTF8 ist eine Codierung für einzelne/doppelte/dreifache Byte-Sequenzen, rechts). Ich fühle mich nicht qualifiziert, besser zu erklären, aber das ist ein Missverhältnis in meiner Wahrnehmung – sehe
1-4 Bytes. Aber ja, das ist eine ziemlich eklatante Diskrepanz. Bis 'char8_t' eingeführt wird, ist' char' für die meisten der UTF-8-Typ der Wahl. – Puppy
Was alle gesagt haben. 'wstring' ist bei Verwendung von UTF-8 einfach falsch. Wenn Sie richtig codierte UTF-8-Literale, insbesondere Windows *, wollen, ist der sicherste Weg, entweder die C++ 11-Literale 'u8" blah "' (die noch nicht in Visual Studio sind) oder Byte-Escapes mit dem Recht zu verwenden Kodierung direkt, dh "\ xE4 \ xBD \ xA0 \ xE5 \ xA5 \ xBD" statt "你好". –