Shift_JIS -> JIS
Javaのアプリケーションで、UNICODEを介さずにShift_JISのDBCSをJISに変換したいとする。ただし、JISで必要なSHIFT-IN/SHIFT-OUTは変換後に付加するので、変換時には敢えて付加しないこととする。
バイナリとエンコードされた文字列から使えるように、引数をbyte配列とし、以下のメソッドを組んだ。
public static final byte[] sjis2JisDBCS(byte[] src) { if ( (src.length % 2) != 0 ) return src;//要素数が奇数の場合は変換できない int i = 0; byte[] result = new byte[src.length]; while ( i < src.length ) { int leader = src[i]; int trailer = src[i+1]; leader -= ( leader <= 0x9F ) ? 0x71 : 0xB1; leader = (byte)(leader << 1); leader ++; if(trailer > 0x7F) { trailer --; } if(trailer >= 0x9E){ trailer -= 0x5e; leader ++; } trailer -= 0x1F; result[i] = (byte)leader; result[i+1] = (byte)trailer; i+=2; } return result; }
これ以上に効率の良い、短いロジックも書けるのだろうが、私にはこれが限界。
これで処理は完璧と思ったのだが、句点が滅茶苦茶のようで"東京特許許可局"を変換すると、"桃供督距距嘉曲"などとなる。(こういうバグって、コンピュータに阿呆な指示をしたのが目に見えて解るので、とても面白い)
さて、何が悪かったのだろうか?