VARIABLE len1 mask1 len2 mask2 len3 mask3 len4 mask4 mask
EUC は、4 つのマルチバイトコードセットを実装しています。 1 番目のコードセット中のマルチバイト文字は、0x00 から 0x7f までの範囲の 1 バイトから始まる len1 バイトのデータで構成されています。 ASCII 文字が使えるようにするため、 len1 は常に 1 です。 2 番目のコードセット中のマルチバイト文字は、 0x8e と 0x8f を除いた 0x80 から 0xff までの範囲の 1 バイトから始まる len2 バイトのデータで構成されています。 3 番目のコードセット中のマルチバイト文字は、 1 バイト目が 0x8e で始まる len3 バイトのデータで構成されています。 4 番目のコードセット中のマルチバイト文字は、 1 バイト目が 0x8f で始まる len4 バイトのデータで構成されています。
EUC マルチバイト文字の rune_t エンコーディングは len および mask 引数に依存しています。 はじめに、各バイトは次のような式で rune_t に変換されます。
byte0 << ((lenN-1) * 8) | byte1 << ((lenN-2) * 8) | ... | bytelenN-1
そして、この結果を ~mask と AND をとり、 maskN と OR をとります。 コードセット 2 および 3 は処理が特殊で、最初に先頭バイト (0x8e あるいは 0x8f) を削除し、 lenN 引数の値を 1 減らします。
例えば、日本語ロケールは次のような VARIABLE 行を持っています。
VARIABLE 1 0x0000 2 0x8080 2 0x0080 3 0x8000 0x8080
コードセット 1 は、0x0000 から 0x007f までの値で構成されています。
コードセット 2 は 0x8080 ビットがセットされた値で構成されています。
コードセット 3 は 0x0080 から 0x00ff までの 値で構成されています。
コードセット 4 は 0x0080 ビットがセットされた値を除いた 0x8000 から 0xff7f までの値で構成されています。
グローバルな mask 値は、0x8080 にセットされることに注意してください。これは、この 2 ビット からコードセットが決定されるということを示しています。
/* * JIS 文字集合の EUC を用いた日本語 LOCALE_CTYPE の定義 */ ENCODING "EUC" /* JIS JIS JIS */ /* X201 X208 X201 */ /* 00-7f 84-fe */ VARIABLE 1 0x0000 2 0x8080 2 0x0080 3 0x8000 0x8080 /* * コードセット 1 */ ALPHA 'A' - 'Z' 'a' - 'z' CONTROL 0x00 - 0x1f 0x7f DIGIT '0' - '9' GRAPH 0x21 - 0x7e LOWER 'a' - 'z' PUNCT 0x21 - 0x2f 0x3a - 0x40 0x5b - 0x60 0x7b - 0x7e SPACE 0x09 - 0x0d 0x20 UPPER 'A' - 'Z' XDIGIT 'a' - 'f' 'A' - 'F' BLANK ' ' ' ' PRINT 0x20 - 0x7e MAPLOWER < 'A' - 'Z' : 'a' > < 'a' - 'z' : 'a' > MAPUPPER < 'A' - 'Z' : 'A' > < 'a' - 'z' : 'A' > TODIGIT < '0' - '9' : 0 > TODIGIT < 'A' - 'F' : 10 > < 'a' - 'f' : 10 > /* * コードセット 2 */ SPACE 0xa1a1 PHONOGRAM 0xa1bc SPECIAL 0xa1a2 - 0xa1fe PUNCT 0xa1a2 - 0xa1f8 /* ここに書くことはたくさんありすぎます */ SPECIAL 0xa2a1 - 0xa2ae 0xa2ba - 0xa2c1 0xa2ca - 0xa2d0 0xa2dc - 0xa2ea SPECIAL 0xa2f2 - 0xa2f9 0xa2fe DIGIT 0xa3b0 - 0xa3b9 UPPER 0xa3c1 - 0xa3da /* ローマ字 */ LOWER 0xa3e1 - 0xa3fa /* ローマ字 */ MAPLOWER < 0xa3c1 - 0xa3da : 0xa3e1 > /* 英字 */ MAPLOWER < 0xa3e1 - 0xa3fa : 0xa3e1 > /* 英字 */ MAPUPPER < 0xa3c1 - 0xa3da : 0xa3c1 > MAPUPPER < 0xa3e1 - 0xa3fa : 0xa3c1 > XDIGIT 0xa3c1 - 0xa3c6 0xa3e1 - 0xa3e6 TODIGIT < 0xa3b0 - 0xa3b9 : 0 > TODIGIT < 0xa3c1 - 0xa3c6 : 10 > < 0xa3e1 - 0xa3e6 : 10 > PHONOGRAM 0xa4a1 - 0xa4f3 PHONOGRAM 0xa5a1 - 0xa5f6 UPPER 0xa6a1 - 0xa6b8 /* ギリシャ文字 */ LOWER 0xa6c1 - 0xa6d8 /* ギリシャ文字 */ MAPLOWER < 0xa6a1 - 0xa6b8 : 0xa6c1 > < 0xa6c1 - 0xa6d8 : 0xa6c1 > MAPUPPER < 0xa6a1 - 0xa6b8 : 0xa6a1 > < 0xa6c1 - 0xa6d8 : 0xa6a1 > UPPER 0xa7a1 - 0xa7c1 /* キリル文字 */ LOWER 0xa7d1 - 0xa7f1 /* キリル文字 */ MAPLOWER < 0xa7a1 - 0xa7c1 : 0xa7d1 > < 0xa7d1 - 0xa7f1 : 0xa7d1 > MAPUPPER < 0xa7a1 - 0xa7c1 : 0xa7a1 > < 0xa7d1 - 0xa7f1 : 0xa7a1 > SPECIAL 0xa8a1 - 0xa8c0 IDEOGRAM 0xb0a1 - 0xb0fe 0xb1a1 - 0xb1fe 0xb2a1 - 0xb2fe IDEOGRAM 0xb3a1 - 0xb3fe 0xb4a1 - 0xb4fe 0xb5a1 - 0xb5fe IDEOGRAM 0xb6a1 - 0xb6fe 0xb7a1 - 0xb7fe 0xb8a1 - 0xb8fe IDEOGRAM 0xb9a1 - 0xb9fe 0xbaa1 - 0xbafe 0xbba1 - 0xbbfe IDEOGRAM 0xbca1 - 0xbcfe 0xbda1 - 0xbdfe 0xbea1 - 0xbefe IDEOGRAM 0xbfa1 - 0xbffe 0xc0a1 - 0xc0fe 0xc1a1 - 0xc1fe IDEOGRAM 0xc2a1 - 0xc2fe 0xc3a1 - 0xc3fe 0xc4a1 - 0xc4fe IDEOGRAM 0xc5a1 - 0xc5fe 0xc6a1 - 0xc6fe 0xc7a1 - 0xc7fe IDEOGRAM 0xc8a1 - 0xc8fe 0xc9a1 - 0xc9fe 0xcaa1 - 0xcafe IDEOGRAM 0xcba1 - 0xcbfe 0xcca1 - 0xccfe 0xcda1 - 0xcdfe IDEOGRAM 0xcea1 - 0xcefe 0xcfa1 - 0xcfd3 0xd0a1 - 0xd0fe IDEOGRAM 0xd1a1 - 0xd1fe 0xd2a1 - 0xd2fe 0xd3a1 - 0xd3fe IDEOGRAM 0xd4a1 - 0xd4fe 0xd5a1 - 0xd5fe 0xd6a1 - 0xd6fe IDEOGRAM 0xd7a1 - 0xd7fe 0xd8a1 - 0xd8fe 0xd9a1 - 0xd9fe IDEOGRAM 0xdaa1 - 0xdafe 0xdba1 - 0xdbfe 0xdca1 - 0xdcfe IDEOGRAM 0xdda1 - 0xddfe 0xdea1 - 0xdefe 0xdfa1 - 0xdffe IDEOGRAM 0xe0a1 - 0xe0fe 0xe1a1 - 0xe1fe 0xe2a1 - 0xe2fe IDEOGRAM 0xe3a1 - 0xe3fe 0xe4a1 - 0xe4fe 0xe5a1 - 0xe5fe IDEOGRAM 0xe6a1 - 0xe6fe 0xe7a1 - 0xe7fe 0xe8a1 - 0xe8fe IDEOGRAM 0xe9a1 - 0xe9fe 0xeaa1 - 0xeafe 0xeba1 - 0xebfe IDEOGRAM 0xeca1 - 0xecfe 0xeda1 - 0xedfe 0xeea1 - 0xeefe IDEOGRAM 0xefa1 - 0xeffe 0xf0a1 - 0xf0fe 0xf1a1 - 0xf1fe IDEOGRAM 0xf2a1 - 0xf2fe 0xf3a1 - 0xf3fe 0xf4a1 - 0xf4a4 /* * これは、コードセット 3 の半角かな用です。 */ SPECIAL 0xa1 - 0xdf PHONOGRAM 0xa1 - 0xdf CONTROL 0x84 - 0x97 0x9b - 0x9f 0xe0 - 0xfe