パスワードを忘れた? アカウント作成
98733 journal

ken_non_sumの日記: 区点コードと Shift_JIS 1

日記 by ken_non_sum


注意:以下の記事は一次資料を参考にすることなく書かれました。
そのため正確性について保証できません。
この記事の利用について筆者は一切の責任を負いかねます。

JIS X 0208 規格によれば,文字の区点コードは区,点それぞれが 1 から 94 までの値をもつので,すべて 14 あるいは 16 ビットでの表現が可能である.

規格票名              | EUC-JP       | ISO/IEC 2022 ESCAPE SEQUENCE
                      | SINGLE SHIFT |
----------------------+--------------+-------------------------------------
ASCII                 |              | "ESC ( B" [0x1b][0x28][0x42]
JIS X 0201-1976 Latin |              | "ESC ( J" [0x1b][0x28][0x4a]
JIS X 0201-1976 Kana  | 0x8e         | "ESC ( I" [0x1b][0x28][0x49]
JIS X 0208-1978       |              | "ESC $ @" [0x1b][0x24][0x40]
JIS X 0208-1983       |              | "ESC $ B" [0x1b][0x24][0x42]
JIS X 0212-1990       | 0x8f         | "ESC $ ( D" [0x1b][0x24][0x28][0x44]
                      |              |
Microsoft CP932       | (undefined)  | (undefined)

Shift_JIS は,JIS X 0208 を以下の矩形領域群に分割して配置している.

     0x40       0x80     0x9f
    +--------+ +--------+-------------------+
0x81|        | |        |                   |
    |        | |        |                   |
0x9f|        | |        |                   |
    +--------+ +--------+-------------------+
    +--------+ +--------+-------------------+
0xe0|        | |        |                   |
    |        | |        |                   |
0xef|        | |        |                   |
    +--------+ +--------+-------------------+
         0x7e       0x9e                0xfc

さらに,ユーザ定義文字領域というものも以下の領域に用意されている.

     0x40       0x80     0x9f
    +--------+ +--------+-------------------+
0xf0|        | |        |                   |
    |        | |        |                   |
0xfc|        | |        |                   |
    +--------+ +--------+-------------------+
         0x7e       0x9e                0xfc

で,その配置方法というのが,英語版 Wikipedia によれば以下の式に従うらしい(何故か日本語版には載っていなかった).

区点コードの前バイトつまり区と 0x20 との和を j1,後バイト(点)と 0x20 との和を j2 とすると,

1) Shift_JIS の上位バイト s1 について
  a) j1 が [0x21, 0x5e] に含まれる ===> s1 = [(j1 + 1)/2] + 0x70.
  b) j1 が [0x5f, 0x7e] に含まれる ===> s1 = [(j1 + 1)/2] + 0xb0.

2) 下位バイト s2 について
  a) j1 が奇数で 0x60 <= j2 ===> s2 = j2 + 0x20.
  b) j1 が奇数で j2 < 0x60 ===> s2 = j2 + 0x1f.
  c) j1 が偶数 ===> s2 = j2 + 0x7e.

が成立する.

上の式から,Shift_JIS では区点コードの空間をブロックに切り分けて配置するのではなく,1 区づつをスライスしてその連続する 2 枚を横に並べて一組とし,それを上位バイトの桁の大きくなるほうに順に並べる,という面倒な対応を構成していることがわかる.
このような方法がとられたのは JIS X 0208 の区点コードと Shift_JIS との間で順序同型性を保つためだろうか.
つまりこの方法ならば,区点コードでの大小関係と Shift_JIS エンコーディングによる文字を 2 バイトの数値とみなしたときの大小関係とを一致させることができる.

なお,ユーザ定義文字領域であるところの「95 区」以降「120 区」までについても,63 区以上 94 区以下についての対応関係に準ずるものと思われる.

Shift_JIS からの区点コード算出は以下の手順で行う.
いま,Shift_JIS エンコーディングの値をもつ 2 バイトの列があるとし,先のバイトの値を s1,後のの値を s2 とする.

1) s1 が [0x81, 0x9f] にも [0xe0, 0xfc] にも含まれない ===> s1 のみで 1 文字を構成しそれは JIS X 0201 の何れかの文字に対応している.

2) s1 が [0x81, 0x9f] か [0xe0, 0xfc] の何れかに含まれるとき,点 cell について
  a) s2 が [0x40, 0x7e] に含まれる ===> 区は奇数で,cell = s2 - 0x1f - 0x20.
  b) s2 が [0x80, 0x9e] に含まれる ===> 区は奇数で,cell = s2 - 0x20 - 0x20.
  c) s2 が [0x9f, 0xfc] に含まれる ===> 区は偶数で,cell = s2 - 0x7e - 0x20.

ここで,2) から区が奇数とわかれば d = 1, 偶数ならば d = 0 とおく.

3) 1) および 2) をもとにすれば,区 row について
  a) s1 が [0x81, 0x9f] に含まれる ===> row = [(s1 - 0x70) * 2] - d - 0x20.
  b) s1 が [0xe0, 0xfc] に含まれる ===> row = [(s1 - 0xb0) * 2] - d - 0x20.

参考:
文字コード表 シフトJIS(Shift_JIS)
Shift JIS - Wikipedia, the free encyclopedia

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

コンピュータは旧約聖書の神に似ている、規則は多く、慈悲は無い -- Joseph Campbell

読み込み中...