Shift_JISについて考えてみた
『文字コード技術入門』読んで、Shift_JISの計算方法について考えてみました。
・JIS X 0201は、ラテン文字集合+片仮名とかの1バイト(7bit or 8bit)の符号化文字集合。
・JIS X 0208は、漢字・平仮名・片仮名等を含んだ2バイトの符号化文字集合。
・Shift_JISは、JIS X 0201の8ビット符号の空いてる場所にJIS X 0208を変形してつっこんだもの。
JIS X 0201の文字(記号含む)は、k区t点(1 <= k <= 94,1 <= t <= 94)のように表されています(http://www.itscj.ipsj.or.jp/ISO-IR/168.pdf)。
JIS X 0201の8bit符号は、0x80〜0x9f、0xe0〜0xffが空いています。(ここ参考)
この空いている部分を利用して、JIS X 0201とJIS X 0208の文字を利用できるようにしたのがShift_JISです。
JIS X 0208 は94区94点あるのに対し、JIS X 0201の8bit符号で空いている場所は、0x80〜0x9F、0xE0〜0xFF つまり64で、94より小さいので、区番号、点番号をそれぞれ1バイトずつ対応させることができないので、以下のように変更します。
・1バイト目
1 <= k <= 62 … (k-1)/2 + 0x81
63 <= k <= 94 … (k-1)/2 + 0xC1
・2バイト目
kが奇数の時
1 <= t <= 62 … t + 0x3F
63 <= t <= 94 … t + 0x40
kが偶数の時
t + 0x9e
とまぁ、こういうことになっていて、最初本読んだ時はまぁへーと思っただけでなんでこうなるんかなと思いつつ深く考えませんでしたが、改めて考えてみると、
・1バイト目で94区全てを表現することができないので、半分の47(0x81〜0x9F,0xE0〜0xEF)にとりあえず対応させる。
・2バイト目は、区が奇数の場合0x40〜0x7E,0x80〜0x9Eの94、区が偶数の場合0x9F〜0xFCの94、合計188箇所に対応させる。
ということですね。結局のところ表現できる文字は47*(94+94) = 8836 (=94*94) ということで無事に対応してます。何も難しいことしてないですね。
2バイト目に0x40〜0x7e割り当てちゃってるからだめ文字が生れるわけですね… 0x7f(DEL)使ってないのは制御文字だし流石にまずいと思ったんでしょうか。
『文字コード技術入門』、分かり易くていいと思います。