はじめ
std::string text = "á";
"A" は(UTF-8エンコーディングを仮定した場合)2バイト文字です。
したがって、次の行を印刷ブースト:: property_tree :: json_parserと2バイト幅の文字
std::cout << text.size() << "\n";
2.しかしstd::cout
が正常にテキストを出力します。
std::cout << text << "\n";
私の問題
私はboost::property_tree::ptree
にtext
を渡した後、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";
に結果が
{
"text": "\u00C3\u00A1"
}
テキストが異なる "á" に等しいです"á"より。
std::wstring
に切り替えることなくこの問題を解決することは可能ですか?ライブラリ(boost::property_tree::ptree
)を変更することでこの問題を解決できる可能性はありますか?
感謝。ニースは 'boost :: property_tree :: json_parser :: create_escapes'で見つけることができます。あなたのソリューションは間違いなく改善です。しかし、UTF-8文字セット全体ではうまくいかないと思います。私は正しい? –
0x7F以上のUnicode文字をコードするすべてのバイトは、0x7F(符号付き文字の場合は0未満)以上であるため、この関数はUTF-8を正しく通過します。一部のUnicode文字は印刷できない場合があり、UTF-8シーケンスは決して表示されません。 – Arpegius
JSON標準では、エンコードについての前提はありません。 Per RFC 46273。エンコーディング JSONテキストはUnicodeでエンコードされます。デフォルトのエンコーディングは UTF-8です。 JSONテキストの最初の2文字は常にASCII 文字[RFC0020]であるため、オクテット ストリームがUTF-8、UTF-16(BEまたはLE)かUTF-32(UTF- BEまたはLE)の最初の4オクテットでヌルのパターンで を見てください。 00 00 00 XX UTF-32BE 00 XX XX 00 UTF-16BE XX 00 00 00 UTF-32LE XX XX 00 00 UTF-16LE XX XX XX XX UTF-8 –