用語: UTF-8

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 Consortium
1991年に設立されました。
詳しくは、http://www.unicode.org/ をご覧ください。

さらら: そうなんだぁ。Unicodeってなにか特徴があるの?

たけち: うん。Unicodeでは、中国・日本・韓国で使われている漢字で、字形が似ているものはひとつのコードにしようとしたんだ。

さらら: えぇ〜。。。それって、なんだか嫌な感じがするわ。

さらら

たけち: そうだね。そういうことが問題視されて、日本なども、これまでのJISコードとの変換性なども含めて、Unicodeに反対した時期があったね。

さらら: それでどうなったの?

たけち: 詳しくは知らないから僕にはなんとも言えないんだ。でも、米国の人からすると、東洋の文化とかそういうこととは違って、あくまでも欧米の文字と漢字などをどのように扱ったらいいか、ということに焦点があるようだね。

さらら: そっか。でも、そういうことをしても、16ビットで世界中の文字が表現できるのかしら?

たけち: そうだね。実は、検討を始めてすぐに16ビットでは足りないことに気づいたので、Surrogateという方式が考えられたんだ。その方式だと、100万字程度までOKなんだよ。これについては、まだ実装されていないし、話がややこしくなるからここではお話しないよ。

さらら: えぇ。

たけち


Unicodeをちょっとみてみましょう

たけち: UTF-8の話の前に、Unicodeを具体的に覗いてみようね。次のサイトで見ることができるんだ。

Unicode Code Charts
http://www.unicode.org/charts/ をご覧ください。

さらら: あっ、見てみたいわ!!

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 Standard Annex #27
http://www.unicode.org/unicode/reports/tr27/tr27-4.html をご覧ください。

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がどんなものかこれで分かったかな。

さらら: うん。でも、具体的にUTF-8でXMLドキュメントを作るにはどうしたらいいのかしら。

たけち: そうだね。それについてはまた別に学ぼうね。じゃぁ、UTF-8の話題はここまで。

さらら: は〜い。ありがとね。

さらら


(注)UTF-8は、ISO 10646では、8-bit UCS Transformation Formatといいます。Unicode Consortium(http://www.unicode.org/)では、UTFをUnicode Transformation Formatと呼んでいます。