2002年1月13日(日)更新 |
■UTF-8ってな〜に?
さらら: UTF-8ってなに? たけち: XMLドキュメントの先頭にあるXML宣言のところにあったよね・・・ さらら: あっ、そういえば・・・いつもは encoding="Shift_JIS" を指定していたけど、UTF-8が基本だったわね。忘れてたわ。 たけち: そうだね。XMLドキュメントの文字コードの基本はUTF-8とUTF-16だったね。 さらら: そのUTF-8って、UTF-16もだけど、どんなものなの? たけち: UTF-8のUTFというのは、Unicode Transformation Format(または 8-bit UCS Transformation Format)のことなんだ。Unicode(ユニコード)という文字コード体系に従った文字コードの交換形式のことなんだよ。 さらら: えっ、Unicode? |
■Unicode(ユニコード)
たけち: Unicode(ユニコード)は、1987年頃に生まれた言葉のようなんだけど、1985年頃から世界中、といっても欧文文字と日本語などが中心だけどね、の文字を2バイト(16ビット)で表現しようと考えられたものなんだ。 さらら: へぇ〜。どういう人たちがやっているの? たけち: 検討が始まった当時は、アップル社・ゼロックス社などの米国の企業の人たちがやっていたようだね。いまは、Unicode Consortiumというのがあってそこでまとめられているね。Apple, IBM, Microsoft, Adobe, Sun Microsystemsなどが参加しているね。
さらら: そうなんだぁ。Unicodeってなにか特徴があるの? たけち: うん。Unicodeでは、中国・日本・韓国で使われている漢字で、字形が似ているものはひとつのコードにしようとしたんだ。 さらら: えぇ〜。。。それって、なんだか嫌な感じがするわ。 |
たけち: そうだね。そういうことが問題視されて、日本なども、これまでのJISコードとの変換性なども含めて、Unicodeに反対した時期があったね。 さらら: それでどうなったの? たけち: 詳しくは知らないから僕にはなんとも言えないんだ。でも、米国の人からすると、東洋の文化とかそういうこととは違って、あくまでも欧米の文字と漢字などをどのように扱ったらいいか、ということに焦点があるようだね。 さらら: そっか。でも、そういうことをしても、16ビットで世界中の文字が表現できるのかしら? たけち: そうだね。実は、検討を始めてすぐに16ビットでは足りないことに気づいたので、Surrogateという方式が考えられたんだ。その方式だと、100万字程度までOKなんだよ。これについては、まだ実装されていないし、話がややこしくなるからここではお話しないよ。 さらら: えぇ。 |
■Unicodeをちょっとみてみましょう
たけち: UTF-8の話の前に、Unicodeを具体的に覗いてみようね。次のサイトで見ることができるんだ。
さらら: あっ、見てみたいわ!! |
たけち: 次の図は、ラテン(欧文文字の基本部分)のコード表と漢字のコード表の一部分なんだ。 |
ラテン(欧文文字の基本部分)のコード表の一部分
漢字コード表の一部分
さらら: あら、ラテンのところって、asciiとそっくりだわ。 たけち: そうだね。asciiコードに1バイト "00"がくっついたものだね。 さらら: 漢字は・・・・たとえば、「万」は、"4E07"なのね。ふ〜ん。Unicodeってこんな感じなんだぁ〜。 たけち: だいたいの雰囲気が分かったところで、UTF-8の話をしなくっちゃね。 さらら: あっ。すっかり忘れてた。 (^ ^; |
■UTF-8
たけち: UTF-8は、テキストデータをファイルにしたり、通信で交換したりするためのコードなんだよ。16ビットのUnicodeを8ビット単位の可変長の文字コードに変換するコード化の方式なんだ。文字の種類によって(Unicodeのコードによって)、変換後のUTF-8コードは、8ビット(1バイト)から32ビット(4バイト)になるんだ。 さらら: えっ? Unicodeで表される文字って16ビット(2バイト)の中に入っているんだから、そのまま16ビット(2バイト)でコード化したほうがいいんじゃないのかしら? たけち: そうだね。実は、そういう方法として、UTF-16というのがあるにはあるんだけど・・・だけど、これまで、そしていまでもascii文字で十分な場合には、ascii文字に余分な1バイト "00" をつけなくちゃいけないから・・・ さらら: えっ? たけち: だから・・・このUTF-8を使うと、ラテン文字は、asciiとまったく同じコードでいいんだよ。 さらら: あっ、ずる〜い!! たけち: あっ。まぁ、そういうことではなくって、Unicodeだからって、やはり余分なことはしないほうがいいよね。 さらら: うっ、う〜ん。 |
たけち: ま、ともかくUnicodeからUTF-8に変換する方法についてちょっとみておこうね。次のサイトをみると載っているんだけど、さっき話したSurrogate(サロゲート)については省略しておくね。
|
UnicodeからUTF-8への変換ルール
Unicode | UTF-8 (1バイト目) |
UTF-8 (2バイト目) |
UTF-8 (3バイト目) |
---|---|---|---|
0000 0000 0xxx xxxx | 0xxx xxxx | ||
0000 0yyy yyxx xxxx | 110y yyyy | 10xx xxxx | |
zzzz yyyy yyxx xxxx | 1110 zzzz | 10yy yyyy | 10xx xxxx |
さらら: ちょっと分かりにくいわ。。。 たけち: そっか。じゃあ、具体例で見てみようね。 さらら: あっ、うれしい。 たけち: 「万葉」という文字でみてみようね。それぞれの文字コードと、UTF-8への変換の様子と結果を図に載せておくね。 |
さらら: あっ、これなら分かるわ。そっか〜。 たけち: UTF-8がどんなものかこれで分かったかな。 さらら: うん。でも、具体的にUTF-8でXMLドキュメントを作るにはどうしたらいいのかしら。 たけち: そうだね。それについてはまた別に学ぼうね。じゃぁ、UTF-8の話題はここまで。 さらら: は〜い。ありがとね。 |
(注)UTF-8は、ISO 10646では、8-bit UCS Transformation Formatといいます。Unicode Consortium(http://www.unicode.org/)では、UTFをUnicode Transformation Formatと呼んでいます。 |