Giriş
std::string text = "á";
"á" (UTF-8 kodlamasını varsayarak) iki baytlık karakterdir.
Yani aşağıdaki satırı baskılarboost :: property_tree :: json_parser ve iki baytlık geniş karakterler
std::cout << text.size() << "\n";
2. Ama std::cout
hala metni doğru yazdırır.
std::cout << text << "\n";
Ben text
boost::property_tree::ptree
ve daha sonra farklı olan
{
"text": "\u00C3\u00A1"
}
metin için "Â ¡" eşittir sonucudur 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";
geçmek
Sorunum "á" dan.
std::wstring
'a dönmeden bu sorunu çözmek mümkün mü? Değişen kitaplığın (boost::property_tree::ptree
) bu sorunu çözmesi mümkün mü?
teşekkürler. Boost :: property_tree :: json_parser :: create_escapes' ile Nice bul. Çözümünüz kesinlikle bir gelişme. Ama ben tüm UTF-8 karakter kümesi için çalışacağını sanmıyorum /. Ben haklı mıyım –
0x7F üzerindeki Unicode karakterini kodlayan tüm baytlar 0x7F'nin üzerinde (imzalı char için 0'ın altında) olduğundan, bu işlev UTF-8 üzerinden doğru şekilde iletilir. Bazı unicode karakterleri elbette yazdırılamayabilir ve bazı UTF-8 dizileri asla görünmemelidir. – Arpegius
JSON standardı, kodlama hakkında herhangi bir varsayımda bulunmaz. RFC 46273'e göre. Kodlama JSON metni Unicode olarak kodlanmalıdır. Varsayılan kodlama UTF-8'dir. JSON metninin ilk iki karakteri her zaman ASCII karakterleri [RFC0020] olduğundan, akışının bir UTF-8, UTF-16 (BE veya LE) veya UTF-32 olup olmadığını belirlemek mümkündür (BE veya LE) 'u ilk dört sekizeteki sıfırların yapısına bakarak görebilirsiniz. 00 00 00 xx UTF-32BE 00 xx 00 xx UTF-16BE xx 00 00 00 UTF-32LE xx 00 xx 00 UTF-16LE xx xx xx xx UTF-8 –