文字コードと符号化方式

世の中には2種類の人間がいます。
文字コードと符号化方式の違いがわかる人とわからない人とが。

以前のエントリーでのグダグダは、文字コードと符号化方式との違いがいまいち理解できていなかった点にあるのではないかと思い、違いのわかる人になりたいので調べてみました。
ちなみにとんでもなく大雑把ですので正確さは期待できません。

符号化方式

符号化方式とは、文字をバイトで表現するためのルールです。
「あ」をバイトで表現する方法は無数にありますが、例えば

あ 0x00

にする事にして、以降あいうえお順に

い 0x01
う 0x02

と割り当てを行った場合、これも符号化方式のひとつと言えます。
ただし、この割り当て方式だと割り当て可能なのは256文字までなので、ひらがなは全部表現できても、漢字はごくわずかしか表現できないでしょう。

現実的には文字の数以外にも考慮する事柄がありますが、日本語の場合は2バイトあれば収まるので長さを2バイトくらいにして、さらにアルファベットとかも使えるようにちゃんとルールを決めて、

あ 0x82 0xA0

とか

あ 0xA4 0xA2

と表現したりします。

いや、日本語だけの場合はそれでいいけど、違う国の文字で同じバイトを違う文字に使っていたら面倒くさくない?
というわけで各種文字が収まるようにもう少し長くして

あ 0xE3 0x81 0x82

と表現したりもします。

日本語を使う場合にお世話になる符号化方式は

が有名です。

文字コード

文字コードを日本語では文字集合と言ったりします。
符号化方式は文字をバイトの列に変換するルールでしたが、そもそもその文字というのが文字コードで定義されているのです。

符号化方式がどれだけ多くの文字を表現できるように設計されていても、文字コードに定義されていない文字は使えません。
と言うよりも、文字コードに定義されている文字を表現できるように符号化方式が設計されていると言えます。

日本語では

が多く使われているようです。

JISでは面-区-点という言い方で文字をあらわし、「あ」の場合1-04-02になります。
Shift_JISEUC-JPはJIS X 0208文字コードとして採用していますので、Shift_JISでの0x82 0xA0もEUC-JPでの0xA4 0xA2も1-04-02の「あ」を指しています。
それ故、Shift_JISからEUC-JPへ変換する事が可能で、理屈としては同じ文字コードを使っている符号化方式同士であれば完璧に変換ができます。

Windows-31J

Windowsで入力した丸付き数字などが他のOSではちゃんと表示されないという話は有名かと思います。
Windowsで日本語を入力する時の符号化方式は、エディタなどではShift_JISと表示されているのになぜ他のOSではうまく表示されないのでしょうか。

実はWindowsでは文字コードへ独自に文字を追加し、Shift_JISと上位互換性のある符号化方式を使用しているのです。
これらの文字コード(と符号化方式)はWindows-31J,MS932又はCP932と呼ばれています。


つづく(Wikipediaとかへ)