#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;
}
ho studiato questo post How to use Boost Spirit to parse Chinese(unicode utf-16)? e seguire le guide, ma non riescono a analizzare le parole "你好"Come usare boost :: spirit per analizzare UTF-8?
i risultati attesi dovrebbero essere
12,3 ab, cd G, G \ "GG kkk 10, \" 0 99.987 PPP 你好
ma i risultati effettivi sono 012.351.641,061 mila12,3 ab, cd G, G \ "GG kkk 10, \" 0 99.987 PPP
Impossibile analizzare le parole cinesi "你好"
OS è 64bits Win7, la mia editor salva le parole come UTF-8
Sono confuso. Stai ... usando UTF8? Perché allora il wstring? (UTF8 è una codifica singola/doppia/tripla sequenza di byte, a destra). Non mi sento qualificato per spiegare meglio, ma questa è una discrepanza nella mia percezione – sehe
1-4 byte. Ma sì, questo è un mismatch abbastanza lampante. Fino a quando non viene introdotto 'char8_t',' char' è il tipo di scelta UTF-8 per la maggior parte. – Puppy
Quello che tutti hanno detto. 'wstring' è sbagliato quando si usa UTF-8. Se vuoi letterali UTF-8 correttamente codificati, * specialmente * su Windows, il modo più sicuro è il C++ 11 letterali 'u8" blah "' (che non sono ancora in Visual Studio) o usa byte escape con il diritto codifica diretta, ovvero "\ xE4 \ xBD \ xA0 \ xE5 \ xA5 \ xBD" anziché "你好". –