【Qt】QProcessでPythonスクリプトの日本語が文字化け【Python】

258, 2019-11-27

目次

QtのQProcessを使ってPythonを走らせる

WindowsでQtのリソースにスクリプトファイルを登録してQFileで読み込んでからQProcessに渡していたのですが、

QFile script(":script/HelloWorld.py");
script.open(QFile::ReadOnly);

proc->start("python", QStringList() << "-c" << script);
# HelloWorld.py
print("Hello, World!")
print("日本語")

これだと日本語の出力が文字化けしました。

Qt

Qtの文字コードを変更。
UTF-8 BOMに設定。BOMが付いてるのはMSVCを使っているため。

Tool -> Option -> Text Editor -> Behavior -> File encodings -> 

編集中のファイルを設定。

Right click -> Add UTF-8 BOM on save

main.cppに↓を追記。

QTextCodec::setCodecForLocale(QTextCodec::codecForLocale());

直書き用にどこかで↓のようなマクロを定義。

#define TR(s) (QString::fromLocal8Bit(s))

↑のマクロを使ってみた実際のコードが↓。

ui->textEdit->setText(TR("日本語"));

QByteArray arr = proc->readAllStandardOutput();
ui->textEdit->setText(TR(arr));

Python

printは使わずsys.stdout/sys.stderrを使います。
エンコードしてバイト列にしないと反応しませんでした。

# HelloWorld.py
import sys

s = "日本語"
sys.stdout.buffer.write(s) # ?
sys.stdout.buffer.write(s.encode("utf-8")) # !

こちらも参照。

おわりに

もしかしたら王道な方法じゃないかもしれません。
特にsys.stdoutなどでバイト列として扱わないといけないあたり何か怪しい気がしました。
また何かいい方法があればコメントください。

投稿者名です。64字以内で入力してください。

必要な場合はEメールアドレスを入力してください(全体に公開されます)。

投稿する内容です。

スポンサーリンク

スポンサーリンク

スポンサーリンク

スポンサーリンク