Chat (Lingr.com)
Informaiton
Daily
Column
- MySQL日本語の旅(5/1)
- アクセス向上秘伝(5/9)
- 一風変ったHaskellλ門(6/13)
- SICP Answer Book (5/31) 問題3.26追加
Zope Solution
Extra
アーカイブ
OSS案内所
Site Info
関連リンク
今回は、ちょっと小難しくなるところもあるので、面倒と思ったら、 読み捨ててもよし。桜も満開で、花見を楽しむのもよい。
さて、sjis, ujis, utf8 などを、たいした説明もせず、キャラクタセットとして いままで書いてきた。しかし、実はこのような呼び方、用語の使い方は、 MySQL独得なので、ここでちょっと説明しておこうかと思う。
前回、gnome-terminalでキャラクタセットの切り替えの仕方を説明したが、 そのときのメニューには、Character Coding と表示されていた。 ちょっと変だと思わなかっただろうか。
この連載では、日本語に関して、 とくに文字についてきちんと説明しようとしているので、 ここははっきり白黒つけておこうと思う。(そこまで言うのは言い過ぎかも)
キャラクタセットの本来の意味は?
キャラクタセットというのは、日本語にそのまま訳せば、文字集合であり、 文字の集りのことである。
JISの規格でいえば、JIS X 0201 が ASCIIや半角片仮名の文字集合を、 JIS X 0208 が、JIS第1水準、JIS第2水準という漢字と記号の集合を決めている。 JIS X 0208 では、文字は、94x94のマス目の1つ1つに入れることになっている。 このマスの位置を示すのに、区と点を用いる。 たとえば、「公」は、24区88点の文字となる。
ここまでが、キャラクタセットの本来の意味である。 直接コンピュータで取扱うには、さらなるバイナリ表現への対応が必要なのである。
キャラクタコーディング
さらなるバイナリへ変換するためには、いくつもの方法が用意されている。 JIS X 0208 の漢字をコンピュータで扱うためのバイナリへの変換ルールに、 シフトJIS や EUC-JP があったりする。 それぞれに、利点もあれば欠点もあるんだが、そういう細かなことは ここでは書かない。
「公」24区88点は、シフトJISだと2バイトで8CF6になり、 EUC-JPだとB8F8になる。同じ漢字も、どのキャラクタコーディングを 適用するかで、値が異なってしまう。
ということで、文字をコンピュータで扱えるように符号化するのであり、 符号化された文字集合のことを、 Coded Character Set(符号化された文字集合)と呼んだり、 符号化という意味を込めて、キャラクタエンコーディングと呼んだり、 キャラクタコーディングと呼んだりしているようだ。
いずれにしろ、符号化された文字に対して、キャラクタセットとは普通は 言わないのである。
8ビットの世界なら
西欧の8ビット文字でこと足りる世界について考えてみよう。 それは、 JIS X 0201 と同じようなものである。 JIS X 0201 は、7ビットで表現されるASCIIに半角片仮名を追加した形になっている。 JIS X 0201 は元々1バイトで扱える文字だけを考えているので、 なにも変換せずそのままコンピュータでも扱ってしまえば、 キャラクタセットとキャラクタコーディングが一致してしまう。
欧米は基本的にそういうシングルバイトの単純な世界なので、 キャラクタセットとコーディングに対して、 とくに考慮する必要も無かったと思われる。
しかし、日本語の世界、あるいは東アジアの漢字やハングルを使う世界は、 1文字を表すにどうしても複数バイトを必要とするマルチバイト言語の世界である。 したがって、欧米では考えもしなかったことが発生することがしばしばある。
データベースは、文字を扱うことが仕事なので、そのあたりで思いっきり 問題が発生する訳である。 データベースだから、データが安全確実に取扱えることが一番重要なことなのだが、 文字化けが起きたりすることがある。そのとき、文字に対する様々な知識が あると非常に問題解決に助かる。
この連載では、そのあたりを詳しくは書かないが、問題発生のときには、 問題解決に繋がるくらいの説明はしていこうかと思う。
MySQLはキャラクタセット
というわけで、MySQLは、キャラクタセットのことも、 キャラクタコーディングのことも、どちらも区別せず、 単にキャラクタセットと呼んでいる。
MySQLの用語はそういうものだと思ってやっていこう。 文字コードの議論をしているときには注意が必要だが、 データベースを利用しているだけなら、たぶん問題にはならないと思う。
戻る:gnome-terminalのCharacter Encodingを変更すると
フィードバック:
There is no comment.