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へ変換をします。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;
ファイルの先頭から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と判定します。