68288


Jsonファイルをリードする関数を作っているのですが  
同じファイルをLinuxとWindowsでリードしたところ、  
Windows側はJsonファイル内に日本語があるとリードできませんでした  
全て英数字のJsonファイルならLinuxでもWindowsでも問題なくリードできるのですが  
QtのWindows版は日本語込みのJsonはリードする方法は無いでしょうか  
以下のソースなのですが・・・

[code]

        //QJson::Parser
        QFile loadfile(_filename);
        if(loadfile.open(QFile::ReadOnly) == false){
            _errstring = loadfile.errorString();
            return false;
        }
        //ファイルオープン成功
        QTextStream in(&loadfile);
        QJsonDocument   jDoc = QJsonDocument::fromJson(in.readAll().toUtf8());  //●jDocに日本語があるとデータが入ってこない
    
[/code]

Windows側はMinGW64bitを使用しています


CC BY-SA 4.0
2020-07-03T10:03:57.207
68249
2020-07-05T03:37:43.257
15047
question
c++ json qt qt-creator
Qt(C++)で日本語のJSONが読めない


おそらくデフォルトのCodecがシフトJISになっているのでしょう。  
`QTextStream in(&loadfile);`の直後、`QJsonDocument jDoc =
QJsonDocument::fromJson(in.readAll().toUtf8());`の前に`in.setCodec("UTF-8");`を挿入すれば良いと思われます。

[void QTextStream::setCodec(const char
*codecName)](https://doc.qt.io/qt-5/qtextstream.html#setCodec-1)

> Sets the codec for this stream to the QTextCodec for the encoding specified
> by codecName. Common values for codecName include "ISO 8859-1", "UTF-8", and
> "UTF-16". If the encoding isn't recognized, nothing happens.  
>  Example:
[code]

>     QTextStream out(&file);
>     out.setCodec("UTF-8");
>  
[/code]

[QTextStreamで文字コードを変換するメモ](http://see-
ku.com/wiki/wiki.cgi?page=QTextStream%A4%C7%CA%B8%BB%FA%A5%B3%A1%BC%A5%C9%A4%F2%CA%D1%B4%B9%A4%B9%A4%EB%A5%E1%A5%E2)

> QTextStreamには、文字コードや改行コードを変換しながらテキストを入出力してくれる機能があるらしい。これは、どれぐらい使えるものなのか？
> さくっと実験してみたのでメモ。  
>  ...  
>  機種ごとの相違点はこんな感じ
>
>   * Windowsでは『System』でShift JISに対応
>

[QTextStream Class Detailed
Description](https://doc.qt.io/qt-5/qtextstream.html#details)

> Internally, QTextStream uses a Unicode based buffer, and QTextCodec is used
> by QTextStream to automatically support different character sets. **By
> default, QTextCodec::codecForLocale() is used** for reading and writing, but
> you can also set the codec by calling setCodec().

[QTextCodec
*QTextCodec::codecForLocale()](https://doc.qt.io/qt-5/qtextcodec.html#codecForLocale)

> Returns a pointer to the codec most suitable for this locale.  
>  The codec will be retrieved from ICU where that backend is in use,
> otherwise it may be obtained from an OS-specific API. **In the latter case,
> the codec's name may be "System"**.


CC BY-SA 4.0
2020-07-03T11:01:07.863
68253
2020-07-03T11:01:07.863
26370
68249
answer


JSONファイルであれば、`QTextStream`を介さずに、直接`QFile`から読み出してもよいと思います。

[code]

        //QJson::Parser
        QFile loadfile(_filename);
        if(loadfile.open(QFile::ReadOnly) == false){
            _errstring = loadfile.errorString();
            return false;
        }
        //ファイルオープン成功
        QJsonDocument   jDoc = QJsonDocument::fromJson(loadfile.readAll());
    
[/code]

この場合、`loadfile.readAll()`で`QByteArray`の型でファイルデータが返ってくるので、  
`QJSonDocument::fromJson(const QByteArray &json, QJsonParseError *error =
Q_NULLPTR)`  
のメソッドで処理できると思います。

＃`readAll()`メソッドは、`QFile`の継承元の`QIODevice`クラスのメソッドです。(参考:
[`QIODevice`](https://doc.qt.io/qt-5/qiodevice.html))


CC BY-SA 4.0
2020-07-05T03:37:43.257
68288
2020-07-05T03:37:43.257
20098
68249
answer