質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

VC++

VC++ (Visual C++) とは、Microsoft製のC++のための統合開発環境です。

MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

UTF-8

UTF-8は8ビット符号単位の文字符号化形式及び文字符号化スキームです。データ交換方式、ファイル形式としては、一般的にUTF-8が使われる傾向があります。

受付中

Win10 VS2015 VC++ MFC (Unicode)で漢字入りJSONを正しく読み書きできるライブラリは実在するか。(続)

Kazumori102
Kazumori102

総合スコア43

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

VC++

VC++ (Visual C++) とは、Microsoft製のC++のための統合開発環境です。

MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

UTF-8

UTF-8は8ビット符号単位の文字符号化形式及び文字符号化スキームです。データ交換方式、ファイル形式としては、一般的にUTF-8が使われる傾向があります。

2回答

0リアクション

0クリップ

288閲覧

投稿2022/09/04 09:02

前提

まず、経験の浅い物のため、ものをあまり知らないことを許していただきたい。

表題の環境下でJSONライブラリで漢字入りJSONを読み込もうとし、下記のライブラリを試したが、エスケープキャラクターでエラーが出る。
JSONはUTF-8でエンコードされているからダメ文字等はないはずだが、この問題が起きる。

  • PicoJSON
  • RapidJSON
  • nlohmnn-jsonn
  • Json11

規格上漢字をはじめとする日本語は要エンコードではないということも確認した。
デバッグしていくと、ファイルの読み込みはともかく、ライブラリにデータを渡した後にエラーが起きているように見える。
ただし、Win環境はエンコード周りが怪しい…。
なお、RapidJSONはダメ文字をバックスラッシュで回避することで読み込めたが、本来不要な処理なはずである。
Linux上では正常に動いている様子はよく見かけるが…。

※前回のが埋もれてしまったのか進展がないので再投稿。
解答いただけたら古いのも終了とします。

実現したいこと

漢字入りJSONを正しく読み込めるライブラリ、もしくは上記の試したライブラリの正しい扱い方を知る。

下記はBOM無しUTF-8でエンコードし保存 (補足要求を念のためこちらでも回答)

kanji_included.json

{ "bad_string" : "表現" }

発生している問題・エラーメッセージ

エスケープシーケンスが含まれる等のメッセージ

該当のソースコード

現在使用しているコード

C++

FILE* fileR; //読込用ファイルポインタ CString bufReadJSON; //読込バッファ CString csResultReadJSON = NULL; //読込結果 CStdioFile cFileR(fileR); //読込用ファイルポインタの変形したもの while (cFileR.ReadString(bufReadJSON)) { csResultReadJSON += bufReadJSON + _T("\n"); } CStringA csaResultReadJSON(csResultReadJSON.GetBuffer(0)); std::string ssResultReadJSON = csaResultReadJSON.GetBuffer(0); csResultReadJSON.ReleaseBuffer(0); csaResultReadJSON.ReleaseBuffer(0); rapidjson::Document hoge hoge.Parse(ssResultReadJSON.c_str()); ssResultReadJSON.clear();

→パースされずにエスケープシーケンスエラー

std::stringの内部表現をShiftJISからUTF-8に変えるらしいコードを試した

C++

std::string ssu8ResultReadJSON = ""; std::ifstream ifs; ifs.open(PARAMSAVE, std::ios::binary); std::string ssBufReadJSON; while (getline(ifs, ssBufReadJSON)) { ssu8ResultReadJSON += ssBufReadJSON; } int lenUni = MultiByteToWideChar(CP_UTF8, 0, ssu8ResultReadJSON.c_str(), ssu8ResultReadJSON.size() + 1, NULL, 0); wchar_t* bufUni = new wchar_t[lenUni]; MultiByteToWideChar(CP_UTF8, 0, ssu8ResultReadJSON.c_str(), ssu8ResultReadJSON.size() + 1, bufUni, lenUni); int lenSJ = WideCharToMultiByte(CP_THREAD_ACP, 0, bufUni, -1, NULL, 0, NULL, NULL); char* cpResultReadJSON = new char[lenSJ]; WideCharToMultiByte(CP_THREAD_ACP, 0, bufUni, lenUni + 1, cpResultReadJSON, lenSJ, NULL, NULL); rapidjson::Document hoge hoge.Parse(cpResultReadJSON);

→ダメだった。(詳細失念)
文字化けかエスケープシーケンスエラーのどちらかの発生。

Json11を使ってみた

C++

FILE* fileR = NULL; //読込用ファイルポインタ CStdioFile cFileR; CString bufReadJSON; //読込バッファ CString csResultReadJSON = NULL; //読込結果 _tfopen_s(&fileR, PARAMSAVE, _T("r,ccs=UTF-8")); CStdioFile cFileR(fileR); //読込用ファイルポインタの変形したもの while (cFileR.ReadString(bufReadJSON)) { csResultReadJSON += bufReadJSON + _T("\n"); } CStringA csaResultReadJSON(csResultReadJSON.GetBuffer(0)); std::string ssResultReadJSON = csaResultReadJSON.GetBuffer(0); csResultReadJSON.ReleaseBuffer(0); csaResultReadJSON.ReleaseBuffer(0); std::string ssErr; jsonDoc.ParseString(ssResultReadJSON, ssErr);

→パースされずにエスケープシーケンスエラー

Json11使ってみた(2:std::stringに統一)

C++

std::string ssResultReadJSON = ""; std::ifstream ifs; ifs.open(PARAMSAVE, std::ios::binary); std::string ssBufReadJSON; while (getline(ifs, ssBufReadJSON)) { ssResultReadJSON += ssBufReadJSON; } std::string ssErr; auto jsonDoc = json11::Json::parse(ssResultReadJSON, ssErr);

→パースはされるが出力すると文字化けている。

試したこと

ファイルの読み出し方を変えたり、CStringに入れたりStd::Stringに入れたり、変換方法を変えてみたりした。

補足情報(FW/ツールのバージョンなど)

さらに詳細な情報の希望があれば可能な限り開示。

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

2022/09/05 12:06

こちらの質問が複数のユーザーから「過去に投稿した質問と同じ内容の質問」という指摘を受けました。

y_waiwai

2022/09/04 10:15

エラーが出たなら、エラーメッセージを提示しましょう エラーメッセージは、よけいな省略翻訳しないで出たそのママをコピペで提示してください

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

VC++

VC++ (Visual C++) とは、Microsoft製のC++のための統合開発環境です。

MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

UTF-8

UTF-8は8ビット符号単位の文字符号化形式及び文字符号化スキームです。データ交換方式、ファイル形式としては、一般的にUTF-8が使われる傾向があります。