EUC-JP

概要

EUC-JPでは1文字は1バイトから3バイトになります。21hから7EhはASCIIになります。A1hからFEhはJIS X 0208の最上位のビットを立てて2バイトで1文字になります。8Ehの後にはJIS X 0201のカタカナが1バイトあり2バイトで1文字になります。8Fhの後にはJIS X 0212の補助漢字が最上位のビットを立てて2バイトあり、3バイトで1文字になります。

実装

SHIFT_JISへ変換

ファイルの先頭からSHIFT_JISへ変換をします。A1hからFEhの1バイトがあれたときには次の1バイトと組み合わせて下記の演算で変換し、2バイトで1文字とします。8Ehがあらわれたときには次の1バイトがそのまま1文字になります。8Fhがあらわれたときには次の2バイトを無視して「?」1文字になります。ファイルの最後で8EhまたはA1hからFEhの1バイトがあれたときには変換は行われず、その1バイトがそのまま1文字になります。そのほかは1バイトがそのまま1文字になります。


(a1は最初の1バイト、a2は次の1バイト)
a1&=~0x80;
a2&=~0x80;
a2+=(a1&1)==0?0x7d:0x1f;
if (a2>=0x7f)
    a2++;
a1=(a1-0x21>>1)+0x81;
if (a1>0x9f)
    a1+=0x40;

SHIFT_JISから変換

ファイルの先頭からEUC-JPへ変換をします。A1hからDFhの1バイトがあれたときには8Ehの後にその1バイトを続けて2バイトで1文字になります。81hから9FhまたはE0hからFChの1バイトがあれたときには次の1バイトと組み合わせて下記の演算で変換し、2バイトで1文字になります。ファイルの最後で81hから9FhまたはE0hからFChの1バイトがあれたときには変換は行われず、その1バイトがそのまま1文字になります。


(a1は最初の1バイト、a2は次の1バイト)
a1-=a1>=0xe0?0xc1:0x81;
a1<<=1;
if (a2>=0x9f) {
    a1+=0x22;
    a2-=0x7e;
} else {
    a1+=0x21;
    a2-=a2>=0x80?0x20:0x1f;
}
a1|=0x80;
a2|=0x80;

判別

ファイルを先頭から解析して、下記の条件をすべて満たすときにはEUC-JPと判定します。


戻る