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と判定します。


戻る