質問編集履歴
3
追加もれ
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
コード例示追加しました。
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
ファイルエンコードについて追記
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" : "表現"
|