質問編集履歴

3

追加もれ

2022/08/20 12:41

投稿

Kazumori102
Kazumori102

スコア45

test CHANGED
File without changes
test CHANGED
@@ -7,6 +7,7 @@
7
7
  - PicoJSON
8
8
  - RapidJSON
9
9
  - nlohmnn-jsonn
10
+ - Json11
10
11
 
11
12
  規格上漢字をはじめとする日本語は要エンコードではないということも確認した。
12
13
  デバッグしていくと、ファイルの読み込みはともかく、ライブラリにデータを渡した後にエラーが起きているように見える。

2

コード例示追加しました。

2022/08/20 12:40

投稿

Kazumori102
Kazumori102

スコア45

test CHANGED
File without changes
test CHANGED
@@ -29,12 +29,109 @@
29
29
  エスケープシーケンスが含まれる等のメッセージ
30
30
 
31
31
  ### 該当のソースコード
32
+ ###### 現在使用しているコード
33
+ ```C++
34
+ FILE* fileR; //読込用ファイルポインタ
35
+ CString bufReadJSON; //読込バッファ
36
+ CString csResultReadJSON = NULL; //読込結果
32
37
 
33
- 持ち帰れない環境なで申訳ないが記載できず。
38
+ CStdioFile cFileR(fileR); //読込用ファイルポインタ変形たもの
39
+
40
+ while (cFileR.ReadString(bufReadJSON)) {
41
+ csResultReadJSON += bufReadJSON + _T("\n");
42
+ }
43
+
44
+ CStringA csaResultReadJSON(csResultReadJSON.GetBuffer(0));
45
+ std::string ssResultReadJSON = csaResultReadJSON.GetBuffer(0);
46
+ csResultReadJSON.ReleaseBuffer(0);
47
+ csaResultReadJSON.ReleaseBuffer(0);
48
+
49
+ rapidjson::Document hoge
50
+
51
+ hoge.Parse(ssResultReadJSON.c_str());
52
+ ssResultReadJSON.clear();
53
+ ```
54
+ →パースされずにエスケープシーケンスエラー
55
+
56
+ ###### [std::stringの内部表現をShiftJISからUTF-8に変えるらしいコードを試した](https://sayahamitt.net/utf8%E3%81%AAstring%E5%85%A5%E3%82%8C%E3%81%9F%E3%82%89shiftjis%E3%81%AAstring%E5%87%BA%E3%81%A6%E3%81%8F%E3%82%8B%E9%96%A2%E6%95%B0%E4%BD%9C%E3%81%A3%E3%81%9F/)
57
+ ```C++
58
+ std::string ssu8ResultReadJSON = "";
59
+
60
+ std::ifstream ifs;
61
+ ifs.open(PARAMSAVE, std::ios::binary);
62
+
63
+ std::string ssBufReadJSON;
64
+ while (getline(ifs, ssBufReadJSON)) {
65
+ ssu8ResultReadJSON += ssBufReadJSON;
66
+ }
67
+
68
+ int lenUni = MultiByteToWideChar(CP_UTF8, 0, ssu8ResultReadJSON.c_str(), ssu8ResultReadJSON.size() + 1, NULL, 0);
69
+
70
+ wchar_t* bufUni = new wchar_t[lenUni];
71
+
72
+ MultiByteToWideChar(CP_UTF8, 0, ssu8ResultReadJSON.c_str(), ssu8ResultReadJSON.size() + 1, bufUni, lenUni);
73
+
74
+ int lenSJ = WideCharToMultiByte(CP_THREAD_ACP, 0, bufUni, -1, NULL, 0, NULL, NULL);
75
+
76
+ char* cpResultReadJSON = new char[lenSJ];
77
+
78
+ WideCharToMultiByte(CP_THREAD_ACP, 0, bufUni, lenUni + 1, cpResultReadJSON, lenSJ, NULL, NULL);
79
+
80
+ rapidjson::Document hoge
81
+ hoge.Parse(cpResultReadJSON);
82
+ ```
83
+
84
+ →ダメだった。(詳細失念)
85
+ 文字化けかエスケープシーケンスエラーのどちらかの発生。
86
+
87
+ ###### Json11を使ってみた
88
+ ```C++
89
+ FILE* fileR = NULL; //読込用ファイルポインタ
90
+ CStdioFile cFileR;
91
+ CString bufReadJSON; //読込バッファ
92
+ CString csResultReadJSON = NULL; //読込結果
93
+
94
+ _tfopen_s(&fileR, PARAMSAVE, _T("r,ccs=UTF-8"));
95
+
96
+
97
+ CStdioFile cFileR(fileR); //読込用ファイルポインタの変形したもの
98
+
99
+ while (cFileR.ReadString(bufReadJSON)) {
100
+ csResultReadJSON += bufReadJSON + _T("\n");
101
+ }
102
+
103
+ CStringA csaResultReadJSON(csResultReadJSON.GetBuffer(0));
104
+ std::string ssResultReadJSON = csaResultReadJSON.GetBuffer(0);
105
+ csResultReadJSON.ReleaseBuffer(0);
106
+ csaResultReadJSON.ReleaseBuffer(0);
107
+ std::string ssErr;
108
+ jsonDoc.ParseString(ssResultReadJSON, ssErr);
109
+ ```
110
+ →パースされずにエスケープシーケンスエラー
111
+
112
+
113
+ ###### Json11使ってみた(2:std::stringに統一)
114
+ ```C++
115
+ std::string ssResultReadJSON = "";
116
+
117
+ std::ifstream ifs;
118
+ ifs.open(PARAMSAVE, std::ios::binary);
119
+
120
+ std::string ssBufReadJSON;
121
+ while (getline(ifs, ssBufReadJSON)) {
122
+ ssResultReadJSON += ssBufReadJSON;
123
+ }
124
+
125
+ std::string ssErr;
126
+ auto jsonDoc = json11::Json::parse(ssResultReadJSON, ssErr);
127
+ ```
128
+ →パースはされるが出力すると文字化けている。
129
+
34
130
 
35
131
  ### 試したこと
36
132
  ファイルの読み出し方を変えたり、CStringに入れたりStd::Stringに入れたり、変換方法を変えてみたりした。
37
- 上記の通り持ち帰られないので例示が効かない。
133
+ ~~上記の通り持ち帰られないので例示が効かない。~~
134
+ 上記に書き足し。上記の通りダメなものばかり。
38
135
 
39
136
  ### 補足情報(FW/ツールのバージョンなど)
40
137
 

1

ファイルエンコードについて追記

2022/08/11 06:47

投稿

Kazumori102
Kazumori102

スコア45

test CHANGED
File without changes
test CHANGED
@@ -17,6 +17,8 @@
17
17
  ### 実現したいこと
18
18
 
19
19
  漢字入りJSONを正しく読み込めるライブラリ、もしくは上記の試したライブラリの正しい扱い方を知る。
20
+
21
+ 下記はBOM無しUTF-8でエンコードし保存 (補足要求を念のためこちらでも回答)
20
22
  ``` kanji_included.json
21
23
  {
22
24
  "bad_string" : "表現"