前提
まず、経験の浅い物のため、ものをあまり知らないことを許していただきたい。
表題の環境下でJSONライブラリで漢字入りJSONを読み込もうとし、下記のライブラリを試したが、エスケープキャラクターでエラーが出る。
JSONはUTF-8でエンコードされているからダメ文字等はないはずだが、この問題が起きる。
- PicoJSON
- RapidJSON
- nlohmnn-jsonn
- Json11
規格上漢字をはじめとする日本語は要エンコードではないということも確認した。
デバッグしていくと、ファイルの読み込みはともかく、ライブラリにデータを渡した後にエラーが起きているように見える。
ただし、Win環境はエンコード周りが怪しい…。
なお、RapidJSONはダメ文字をバックスラッシュで回避することで読み込めたが、本来不要な処理なはずである。
Linux上では正常に動いている様子はよく見かけるが…。
※前回のが埋もれてしまったのか進展がないので再投稿。
解答いただけたら古いのも終了とします。
実現したいこと
漢字入りJSONを正しく読み込めるライブラリ、もしくは上記の試したライブラリの正しい扱い方を知る。
下記はBOM無しUTF-8でエンコードし保存 (補足要求を念のためこちらでも回答)
kanji_included.json
1{ 2 "bad_string" : "表現" 3}
発生している問題・エラーメッセージ
エスケープシーケンスが含まれる等のメッセージ
該当のソースコード
現在使用しているコード
C++
1FILE* fileR; //読込用ファイルポインタ 2CString bufReadJSON; //読込バッファ 3CString csResultReadJSON = NULL; //読込結果 4 5CStdioFile cFileR(fileR); //読込用ファイルポインタの変形したもの 6 7while (cFileR.ReadString(bufReadJSON)) { 8 csResultReadJSON += bufReadJSON + _T("\n"); 9} 10 11CStringA csaResultReadJSON(csResultReadJSON.GetBuffer(0)); 12std::string ssResultReadJSON = csaResultReadJSON.GetBuffer(0); 13csResultReadJSON.ReleaseBuffer(0); 14csaResultReadJSON.ReleaseBuffer(0); 15 16rapidjson::Document hoge 17 18hoge.Parse(ssResultReadJSON.c_str()); 19ssResultReadJSON.clear();
→パースされずにエスケープシーケンスエラー
std::stringの内部表現をShiftJISからUTF-8に変えるらしいコードを試した
C++
1std::string ssu8ResultReadJSON = ""; 2 3std::ifstream ifs; 4ifs.open(PARAMSAVE, std::ios::binary); 5 6std::string ssBufReadJSON; 7while (getline(ifs, ssBufReadJSON)) { 8 ssu8ResultReadJSON += ssBufReadJSON; 9} 10 11int lenUni = MultiByteToWideChar(CP_UTF8, 0, ssu8ResultReadJSON.c_str(), ssu8ResultReadJSON.size() + 1, NULL, 0); 12 13wchar_t* bufUni = new wchar_t[lenUni]; 14 15MultiByteToWideChar(CP_UTF8, 0, ssu8ResultReadJSON.c_str(), ssu8ResultReadJSON.size() + 1, bufUni, lenUni); 16 17int lenSJ = WideCharToMultiByte(CP_THREAD_ACP, 0, bufUni, -1, NULL, 0, NULL, NULL); 18 19char* cpResultReadJSON = new char[lenSJ]; 20 21WideCharToMultiByte(CP_THREAD_ACP, 0, bufUni, lenUni + 1, cpResultReadJSON, lenSJ, NULL, NULL); 22 23rapidjson::Document hoge 24hoge.Parse(cpResultReadJSON);
→ダメだった。(詳細失念)
文字化けかエスケープシーケンスエラーのどちらかの発生。
Json11を使ってみた
C++
1FILE* fileR = NULL; //読込用ファイルポインタ 2CStdioFile cFileR; 3CString bufReadJSON; //読込バッファ 4CString csResultReadJSON = NULL; //読込結果 5 6_tfopen_s(&fileR, PARAMSAVE, _T("r,ccs=UTF-8")); 7 8 9CStdioFile cFileR(fileR); //読込用ファイルポインタの変形したもの 10 11while (cFileR.ReadString(bufReadJSON)) { 12 csResultReadJSON += bufReadJSON + _T("\n"); 13} 14 15CStringA csaResultReadJSON(csResultReadJSON.GetBuffer(0)); 16std::string ssResultReadJSON = csaResultReadJSON.GetBuffer(0); 17csResultReadJSON.ReleaseBuffer(0); 18csaResultReadJSON.ReleaseBuffer(0); 19std::string ssErr; 20jsonDoc.ParseString(ssResultReadJSON, ssErr);
→パースされずにエスケープシーケンスエラー
Json11使ってみた(2:std::stringに統一)
C++
1std::string ssResultReadJSON = ""; 2 3std::ifstream ifs; 4ifs.open(PARAMSAVE, std::ios::binary); 5 6std::string ssBufReadJSON; 7while (getline(ifs, ssBufReadJSON)) { 8 ssResultReadJSON += ssBufReadJSON; 9} 10 11std::string ssErr; 12auto jsonDoc = json11::Json::parse(ssResultReadJSON, ssErr);
→パースはされるが出力すると文字化けている。
試したこと
ファイルの読み出し方を変えたり、CStringに入れたりStd::Stringに入れたり、変換方法を変えてみたりした。
補足情報(FW/ツールのバージョンなど)
さらに詳細な情報の希望があれば可能な限り開示。
