こんにちわ。ニッパチです。
まだまだ暑い日が続きますが、みなさんいかがお過ごしでしょうか。
今回は現在業務でバイナリファイルを読みこむ処理を行っているのですが、その際に詰まったことを書こうと思います。
内容
以下のようなバイト文字列があるとします。
0x24 0x22 0x24 0x24 0x24 0x26 0x24 0x28 0x24 0x2A
これはJISコード(iso-2022-jp)であいうえおとなります。
これをC#で読み込んでみます。
byte[] bytes = new byte[] { 0x24, 0x22, 0x24, 0x24, 0x24, 0x26, 0x24, 0x28, 0x24, 0x2a };
var encode = Encoding.GetEncoding("iso-2022-jp");
var s = encode.GetString(bytes);
Console.WriteLine(s);
// 結果
$"$$$&$($*
思い通りの結果になりませんでした。
結果からして1バイトずつ変換しているようです。
今回の業務で使用しているバイナリファイルは文字列部分は上記のうようにJISコードで2バイト単位で書かれていました。
そのためシステム側で読み込むと結果のとおり読めない日本語になっていました。
解決法
調べると漢字シフトコードというものがあり、それを追加してあげると2バイトずつ変換されるようになり正しい日本語が表示されるようになりました。
// バイト列に1B 24 42を加える
byte[] bytes = new byte[]
{ 0x1B, 0x24, 0x42, 0x24, 0x22,
0x1B, 0x24, 0x42, 0x24, 0x24,
0x1B, 0x24, 0x42, 0x24, 0x26,
0x1B, 0x24, 0x42, 0x24, 0x28,
0x1B, 0x24, 0x42, 0x24, 0x2a };
感想
新しい発見があって楽しかったです。