質問: ### 前提・実現したいこと linux(ubuntu18.04)にmosquittoをインストールし、 testというtopicでメッセージを受けられるようにしています。 Windowsから日本語のメッセージを受けられるようにしたいと考えています。 ### 発生している問題・エラーメッセージ ubuntu上の別の端末からmosquitto_pubからメッセージを投げると英数字も日本語も問題なく受信されますが、Windows上のmosquitto_pub.exeからメッセージを投げると日本語のみ文字化けしてしまいます。 ### 該当の操作ログ ubuntu18.04の端末 ``` $ mosquitto_sub -t test -v test sirokuma test ���낭�� ``` Windowsコマンドプロンプト ``` Active code page: 65001 C:\Program Files\mosquitto>mosquitto_pub -h ubuntu -t test -m sirokuma C:\Program Files\mosquitto>mosquitto_pub -h ubuntu -t test -m しろくま ``` ### 試したこと Windows上のコマンドプロンプトの文字コードの問題かと考え ``` chcp 65001 ``` として文字コードをutf-8に変更してみても文字化けの仕方に変化は見られませんでした。 ### 補足情報(FW/ツールのバージョンなど) mosquitto-1.5.3-install-windows-x64.exe (~360 kB) (64-bit build, Windows Vista and up, built with Visual Studio Community 2017) をWindows10にインストールしています
回答: Windows のコマンドプロンプト(cmd.exe)上でコマンドラインオプションで日本語文字列を指定し、外部プログラム(今回の例ではmosquitto_pub)を起動すると、外部プログラムのランチャーであるcmd.exeにより更に文字列がエンコードされてしまい、意図しない文字コードでその外部プログラムに渡されてしまいます。 コンソール上で`chcp`コマンドで 65001(UTF-8) を指定し、`-m しろくま`と指定してUTF-8で渡したつもりでも、mosquitto_pub.exe が呼び出される時点で更に変換されてしまう(この時点でもう文字化け)ということです。 mosquitto_pubのオプション指定のとき、`-m メッセージ文字列` ではなく`-f ファイル名`で指定することでファイルの中身そのままが送られます。こちらを使用することでUTF-8の日本語文字列をそのまま送信することができます。 "しろくま"と記述したファイルをUTF-8(BOM無し)で保存し、そのファイルを`-f ファイル名`で指定して実行してみてください。以下は、UTF-8で"しろくま"と記述したsirokuma.txtと言う名前のファイルを作成し、16進数ダンプしてUTF-8であることを確認した例です。 ``` C>certutil -dump sirokuma.txt 0000 ... 000c e3 81 97 e3 82 8d e3 81 8f e3 81 be ............ CertUtil: -dump コマンドは正常に完了しました。 ``` このファイルを`-f`オプションで指定して実行します。これでlinux側で正しく表示されるはずです。 ``` C> mosquitto_pub -h <送信先のアドレス> -t test -f sirokuma.txt ``` 下の画像は、Windows7 対 Ubuntu16.04 で実際に試した例です。`chcp 65001`でUTF-8のコンソールにしなくても、UTF-8の"しろくま"文字列がUbuntu16.04 側で稼動するサブスクライバーである mosquitto_sub で表示できています。 !イメージ説明