UTF-8っておまえなんなの

なにやらWebっぽいものを作っている時に、文字コードという物を意識して何か仕事をすることは、昨今殆どないように思います。基本的には、とりあえずUTF-8にしとけば恋も仕事も万事okで、UTF-8ってなんなのどうなってんの、みたいなところに踏み込むことはまずありません。せいぜい扱うデータがShift_JISで変換がめんどくせえとか、そういう話です。みなさま、何が良くてUTF-8が使われているのか、何故16じゃ駄目なのか、何故AKBは48人なのか、気になりはしないでしょうか。こいつそんなことも知らないの、と思った方は、生暖かい指で⌘Wを押してください。お願いします。

ついでに余談なんですが、そんな話に出会う度、なんだかんだ、細かいことは知らなくたって、仕事できてしまうというのもあって、こういうのって理系の大学生なんかだったら、常識的に知ってることなんだろうか、と不安になってしまったりします。なんかでも、つまんないことで何これ面白いなって思えるのも人生得した気分になれるよね。うん。そう思うことにしよう。

UTFナントカのことを調べているとUnicodeという言葉がちらちら出てくるのですが、どうもこの辺がなんか8だとか16だとか数字がつくところのポイントのようで、Unicodeが何かって言ったらみたいな話が必要かわからないけど、ともかく世界中の文字をなんか1個の辞書で管理したいよねみたいなところで、簡単にいえばa,b,c,d,e,f,gってそれぞれに1,2,3,4,5,6,7みたいな番号が振られてて、1って言われたらaのことだぞみたいな辞書部分がUnicodeと呼ばれる部分のようです。そして、世界中にある文字を1つの辞書に詰め込んだ時に、10万番目の文字を表したいと思った時、数値は8bit(1byte)で256まで、16bit(2byte)で約64,000、24bit(3byte)で約16,000,000まで表せるので、10万番目の文字を扱うには3byte必要になる、というところまでわかれば、つまるところUTF-8の-8というのは8bitの8で、256番目までに収まっている文字(平たく言えば、アルファベットや一般的な記号文字)までを扱うことができる形式というわけなのかと思ったら、いいえ、違います。

何が違うかって「アレ?俺HTMLにcharset=UTF-8って書いてるけど日本語使えてるべ?日本語何文字あると思ってんだべ?」みたいなアレがアレなんですが、その辺がUTF-ほにゃほにゃの面白いところで、アルファベットとかは8bitで表現するけども、それ以降の文字が来たら、UTF-8のくせに次の8bitも使って16bitで表現しようとします。そして、日本語なんかはそれでも足りないのでその次の8bitも使って、24bit、つまり1文字の表現に3byteが使われています。そんな風に増えてくんだったら、UTF-16とかいらねーじゃん、なんでお前この世に存在してるの?という話になるのですが、UTF-8は基本8bitを1文字として扱おうとするので、16bitで表現したい時に、次の8bitも1文字の中に含まれるんだよ、という情報をどこかに持つ必要があります。それを最後の1bitが0か1かで判断すると、実質Unicode上何番目の文字を表現したいか、としてのデータに使えるのは7bitになります。

そうすると、1byteで8bitで2の8乗 = 256番目までではなくて、2の7乗 = 128番目までしか表現できないので、それ以上の文字を扱おうとすると効率が悪くなります。UTF-16の場合は、まず16bitが1文字であるとして表現しようとするので、同じロジックを適用するとしたら、2の15乗 = 32768番目まで効率よく扱うことができそうです。先述の通り、日本語はUTF-8で3byteですが、UTF-16だと2byteらしく、これだけ見ると小さい話ですが、1.5倍なので、膨大な量のテキストを処理する場合、大きな違いになりそうな感じです。ジャバスクリプトなんかもそうですが、直接日本語を扱っても大丈夫な言語というのは、大体文字をUTF-16で処理するんだそうです。

はじめの話に戻って、何故UTF-8が良いのかと言えば、プログラムの殆どはアルファベットと記号で表せるので、128文字目までが効率的に表せる、UTF-8がエンコード形式として最も効率が良い、ということだと思います。逆に言えば、こういうジャパニーズポエムは、UTF-16で保存したら容量が2/3近くまで節約できる、ということです。

ねっ 面白いでしょ。でしょでしょ。