はじめに
少しニッチな内容なのですが、ハンディターミナル1という機器のアプリケーション開発時に出会った事象をご紹介します。
事象
QRコードの読み取り結果が文字化けする。
原因
読み取った値をShift-JIS に変換して扱っていたが、QRコードの文字コードがUTF8だったため、正しく変換されなかった。
対応
今回のHT開発で使用している.NET Compact Framework 3.52には文字コード判別の方法が用意されていないため、第三者作成のDLLを使うかロジックを自作する方法が考えられますが、今回は事前に文字コードが分かっているため、判断ロジックを入れずに対応しました。
以下は文字コード変換部分のコード抜粋です。
// QRコードがShift-JIS の場合
// Encoding クラスに用意されている文字コード以外のインスタンスを取得する際はGetEncoding を使う
System.Text.Encoding sjis = System.Text.Encoding.GetEncoding("shift_jis");
byte[] codeData = sjis.GetBytes(code); // code はstring 型の読み取った値
string result = sjis.GetString(codeData, 0, code.length);
// QRコードがUTF8 の場合
System.Text.Encoding utf8 = System.Text.Encoding.UTF8;
byte[] codeData = utf8.GetBytes(code); // code はstring 型の読み取った値
string result = utf8.GetString(codeData, 0, code.length);
さいごに
Android/iOS 向けのアプリ開発の場合、上記文字コードの考慮はあまり必要なさそうです。
Flutterのpub.dev で提供されているフリーのバーコードリーダーライブラリでも文字コードを自動的に判別して正しい読取結果を返してくれます。
昨今Windows CE 端末向けの開発は減ってきていると思われますが、ご参考になれば幸いです。
-
物流現場で使われることが多いバーコードを読み取る機械です。「ハンディ」、「HT」と省略されることが多いです。 ↩
-
Windows CEベースのモバイル・組み込みデバイス上で動作するように設計された、アプリケーション開発・実行環境です。.NET Frameworkの完全なコピーではなく、より少ないスペース、リソース環境下において使用できるよう縮小されているため、開発時に利用したい機能が含まれていないことが判明するケースが稀にありました。引用: https://ja.wikipedia.org/wiki/.NET_Compact_Framework ↩