シリアル通信で送信した半角カナが文字化けする現象について
発生している問題
文字コードと電文制御についての質問となります。
PCからラベラプリンタへシリアル通信でラベルデータを送信しているのですが、QRコードのデータ部において、半角カナを送信しラベル発行した際に、QRをカメラで認識すると半角カナのみ?となってしまう現象で悩んでおります
VB6で開発されたプログラムをVB.NETへ更新を試みており、以前使用していたコードと同様に記述しています。全角文字はJIS変換をし、16進数の2バイトで送信、こちらは問題なく印字できております。
半角カナは変換をかけずにそのまま送信しておりましたので、同じようにそのまま送信しましたが、文字化けが発生してしまいます。VB6.0のプログラムで印字したQRでは問題なく半角カナが読めています。
ラベラメーカーに問い合わせしておりますがこちらでも質問させていただきます。
[追記]
皆様のコメントで気が付いたことがありますので記述していきます。
VB6からVB.Netに移行し、シリアル通信のメソッドの記述が変わっています。
現在は、コード内で
SerialPort1.Write(str)
として、エスケープシーケンスを含めた文字列を送っていました。
SerialPortのリファレンスガイドを見ると、引数の指定をするとバイト配列を書き込むオーバーロードが呼び出されます。
つい文字列を書き込めば勝手にバイトに変換して書き込むだろうと認識していました。ここで誤った文字コードへの変換がされている可能性があるかもしれません。
頂いたコードとともに実機テストが終わり次第、記事更新させていただきます。
質問
- 他に試せそうなことはありますか
- VB.NETのString型はUTF-16とのこと、VB6.0と互換性の問題はあるでしょうか
- ラベラなどの機器でメーカー独自の文字コード表を使用している可能性はあるでしょうか
発生している問題・エラー・サンプル
送信データ
(略)4ONB030001D0000ス6シ000000000000
↓
読み取りデータQR スマホ
(略)4ONB030001D0000?6?000000000000
自分で試したこと
・全角文字と同様に半角カナもShift-JISからJISへ変換を試みた→元のプログラムと同じバイトデータがコンソール出力できているが、ラベラにデータを送信して印字するとQRデータに反映されない
・エスケープシーケンス "ESC(I" を送信して半角カナの切り替えを試みた→エスケープシーケンス以降のデータが入らない
・ラベラ側の漢字変換文字コードをJIS→Shift-JISに変更→全角文字のみ文字化け、データ部の半角カナは?となる
ソースコード(半角カナ変換)
For i = 1 To psSiftJis.Length '桁数分繰り返す
vHex = Hex(Asc(Mid(psSiftJis, i, 1))) '1バイトのシフトJISコードに変換
If vHex = "20" Then '空白なら抜ける
vConv = Space(4)
Exit For
End If
kByte = Val("&h" & vHex) '16→10進変換
If kByte >= &H80 Then '半角カナのみShiftJIS→JIS変換
kByte = kByte - &H80
vConv = vConv & Chr(&H1B) & Chr(&H28) & Chr(&H49) & Chr("&h" & Hex(kByte)) '半角カナ開始エスケープシーケンス[ESC(I]
Else
vConv = vConv & Chr("&h" & Hex(kByte))
End If
Next
実行環境
(以前)
Windows10
VB6.0
(更新後)
Windows10
VB.Net(.NET Framework4.7)
Visual Studio Professional 2017 version15.9.56