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

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

新規登録して質問してみよう
ただいま回答率
85.50%
MQTT

MQTT(Message Queue Telemetry Transport)とは、TCP/IPネットワークで利用可能な通信プロトコルの一つで、IoT/M2M向けに開発された軽量なプロトコルです。ヘッダ部分は最小2バイトと小さく、通信量・CPU負荷・電力消費量などを抑えることができます。

Q&A

解決済

1回答

5884閲覧

WindowsコマンドラインからのMQTTメッセージ(日本語)がLinuxサーバで受信すると文字化けしてしまう

sirokum

総合スコア13

MQTT

MQTT(Message Queue Telemetry Transport)とは、TCP/IPネットワークで利用可能な通信プロトコルの一つで、IoT/M2M向けに開発された軽量なプロトコルです。ヘッダ部分は最小2バイトと小さく、通信量・CPU負荷・電力消費量などを抑えることができます。

0グッド

0クリップ

投稿2018/10/17 04:56

前提・実現したいこと

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にインストールしています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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であることを確認した例です。

cmd.exe

1C>certutil -dump sirokuma.txt 2 0000 ... 3 000c 4 e3 81 97 e3 82 8d e3 81 8f e3 81 be ............ 5CertUtil: -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 で表示できています。

イメージ説明

投稿2018/10/18 14:43

dodox86

総合スコア9183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sirokum

2018/10/19 02:40

示していただいた方法で正常に日本語を含む文字列が送信できることを確認できました。 ありがとうございます。 UTF-8のファイルを作成する手順が増えるものの、Windows端末からLinuxサーバへ日本語を含むメッセージを送る処理を実装できそうです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問