はじめに
数年前の話ですが、「MySQL へ登録したデータが文字化けしているんですけど、文字コードを UTF-8 から Unicode に変えれば直りますかね?」という意味不明なことを質問されました。(私の周りでは・・)今時はもうほとんど UTF-8 で扱うことが多く、文字コードで悩まされることも少なくなりましたが、だからこそ基本的なことを残しておこうかと思います。
文字集合とは
読んで字の如く、文字の "集合" です。Wikpedia で 集合 のページを見ると
数学における集合 (しゅうごう、英: set, 仏: ensemble, 独: Menge) とは、大雑把に言えばいくつかの「もの」からなる「集まり」である。
と書いてあります。あまり具体的になりませんでしたね
私なりの言葉で表現すると「文字集合に含まれる文字、含まれない文字が明確になっている」「文字集合に含まれる文字が 1つ 1つ区別できる」という感じですかね。んー、余計に分かりにくい・・?
文字符号化方式とは
いわゆる "エンコーディング" のことです。文字の集合をコンピュータで扱えるようにしたもので、代表的なものに UTF-8、Shift_JIS、EUC-JP などがあります。
文字集合に含まれる任意の文字とその符号化された文字の間には 1 対 1 の対応が存在します。
もう少し具体的に・・
分かり易くするために細かな部分は端折ります。
細かな部分を正しく説明できる自信もないので、この投稿をご覧になった皆さん自身でより詳しく調べることをお勧めします。
日本語の文字集合として主なものに下記 2つがあります。
- JIS 漢字コード
-
文字に区と点の番号が割り付けられているもの
符号化方式としては主に Shift_JIS や EUC-JP がある - Unicode
-
文字にコードポイントと呼ばれる番号が割り付けられているもの
符号化方式としては主に UTF-8 や UTF-16 がある
同じ文字集合をベースにしている Shift_JIS と EUC-JP の間は基本的には符号化方式を変換することができます。上で述べたように文字集合と符号化方式の間には 1 対 1 の対応が存在しますので、区点番号を介せば Shift_JIS と EUC-JP の間にも 1 対 1 の対応が存在します。
一方、異なる文字集合の Shift_JIS と UTF-8 ですが、そもそもの集合が異なりますので、普通には変換することができません。実際に変換プログラムを見たことも書いたこともないのですが、おそらく変換表のようなものを使っていると思われます。(違ったらごめんなさい)
文字集合が異なるので、Shift_JIS の波ダッシュ(~)を UTF-8 の "WAVE DASH" と "FULLWIDTH TILDE" のどちらに対応付けるか?といった問題も発生しますね。UTF-8 から Shift_JIS への変換ならば 1つに決まるのだけれど・・(数学用語でいうと全射)。
さいごに
伝えたいことは、「文字コードの一言で済まさず、集合の概念と符号化方式をきちんと意識して扱いましょう」ということです。
余談
UTF-16 は 2バイト単位で文字を処理するため、ファイルの先頭にバイトオーダーマーク(いわゆる BOM)を置いて、そのファイルがどちらのエンディアンで作成されたものなのかを判別します。反面、UTF-8 は 1バイト単位で処理するので、本来 BOM は不要なのですが、なぜか BOM を付けることもできるという変なことになってます。