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;
} これ以上に効率の良い、短いロジックも書けるのだろうが、私にはこれが限界。
これで処理は完璧と思ったのだが、句点が滅茶苦茶のようで"東京特許許可局"を変換すると、"桃供督距距嘉曲"などとなる。(こういうバグって、コンピュータに阿呆な指示をしたのが目に見えて解るので、とても面白い)
さて、何が悪かったのだろうか?