Wprowadzenie
std::string text = "á";
"A" ma postać dwóch bajtów (zakładając kodowanie UTF-8).
Więc następujące odciski linii 2.boost :: property_tree :: json_parser i dwu-bajtowych szerokości znaków
std::cout << text.size() << "\n";
Ale std::cout
nadal drukuje tekst poprawnie.
std::cout << text << "\n";
Mój problem
mijam text
do boost::property_tree::ptree
a następnie write_json
boost::property_tree::ptree root;
root.put<std::string>("text", text);
std::stringstream ss;
boost::property_tree::json_parser::write_json(ss, root);
std::cout << ss.str() << "\n";
Rezultatem jest
{
"text": "\u00C3\u00A1"
}
tekst jest równy "Â ¡", która jest inna niż "á".
Czy można naprawić ten problem bez przełączania na std::wstring
? Czy jest możliwe, że zmiana biblioteki (boost::property_tree::ptree
) może rozwiązać ten problem?
Dzięki za odpowiedź. Ładne znalezisko z 'boost :: property_tree :: json_parser :: create_escapes'. Twoje rozwiązanie zdecydowanie stanowi ulepszenie. Ale nie sądzę, że działa to dla całego zestawu znaków UTF-8; /. Czy mam rację ? –
Wszystkie bajty kodu Unicode powyżej 0x7F znajdują się powyżej 0x7F (poniżej 0 dla podpisanego znaku), więc ta funkcja poprawnie przechodzi przez UTF-8. Niektóre znaki unicode mogą nie być oczywiście drukowane, a niektóre sekwencje UTF-8 nigdy nie mogą się pojawić. – Arpegius
Standard JSON nie zawiera żadnych założeń dotyczących kodowania. Zgodnie z RFC 46273. Kodowanie Tekst JSON MUSI być zakodowany w Unicode. Domyślne kodowanie to UTF-8. Ponieważ pierwsze dwa znaki tekstu JSON zawsze będą ASCII znaków [RFC0020], możliwe jest określenie, czy oktetowy strumień to kodowanie UTF-8, UTF-16 (BE lub LE) lub UTF-32 (BE lub LE), wyszukując według wzorca zer w pierwszych czterech oktetach. 00 00 00 XX UTF-32BE 00 X X 00 X X UTF-16BE XX 00 00 00 UTF-32LE X X 00 X X 00 UTF-16LE XX XX XX XX UTF-8 –