日本語は1文字何バイト?
日本語の1文字は何バイト? と訊かれると、2バイトと答える人がまだ多いのではないでしょうか。しかし、Unicodeの普及とともに1文字が3バイトや4バイト、場合によってはそれ以上になるケースも出てきています。そこでふと、1文字が1バイトから8バイトまで全部のパターンがそろっていたら愉快ではないかと思い、少し考えてみました。(なお、この文章中では1バイト=1オクテットの意味で使用します。またUTF-16、UTF-32はすべてビッグエンディアンとします。)
■日本語1文字が1バイト
- 半角カナ(JIS X 0201-1997の片仮名用図形文字集合)をShift_JISで符号化(エンコード)したものは、1文字が1バイトになります。例えば、「ア」はB1で1バイトです。ちなみに、同じ半角カナでもEUC-JPではシングルシフト2がついて2バイト(8EB1)、UTF-8では3バイト(EFBDB1)になるので、半角カナだからと言って常に1バイトになるとは限りません。
■日本語1文字が2バイト
- これはもういろんなパターンがありますが、代表的なのはJIS第一・第二水準の漢字(JIS X 0208:1997)をShift_JISで符号化した場合でしょう。たとえば「愛」は88A4の2バイトになります。ほかには、EUC-JPで符号化した場合も2バイト(B0A6)、UTF-16なんかでも2バイト(611B)ですね。 濁点・半濁点が付いたShift_JISの半角カナなども1文字2バイトと言えるかもしれません。
■日本語1文字が3バイト
- 最近増えてきているのはこれ。UnicodeのBMP(Basic Multilingual Plane、基本多言語面、第0面)の漢字をUTF-8で符号化すると、1文字が3バイトになります。たとえば「愛」はE6849Bの3バイトです。他にも、JIS補助漢字(JIS X 0212-1990)をEUC-JPで符号化すると、シングルシフト3がついて3バイトになります。
■日本語1文字が4バイト
- これも結構種類があります。まずUnicodeのSIP(Supplementary Ideographic Plane、追加漢字面、第2面)の漢字をUTF-8で符号化すると、1文字が4バイトになります。たとえば、「𠮷」(土+口の”吉”、U+20BB7)はF0A0AEB7の4バイトです。また同じ文字をUTF-16で符号化した場合も、サロゲートペアを使った4バイト(D842DFB7)になります。UTF-32でもやはり4バイト(00020BB7)ですね。
■日本語1文字が6バイト
- UnicodeのBMPの漢字にVS(Variation Selector、異体字セレクタ)を付けたものをUTF-16で符号化すると、Base Characterが2バイト+VSが4バイト(サロゲートペア)で、計6バイトになります。たとえば「廣󠄁」(广+黄の”廣”、<U+5EE3,U+E0101> )は5EE3DB40DD01で6バイトになります。ほかには、濁点・半濁点付きのカナ、たとえば「が」をNFD(Normalization Form Canonical Decomposition、正規化形式D)で正規化すると、「か」(U+304B)と濁点(U+3099)に分離され、これをUTF-8で符号化するとE3818BE38299の6バイトとなります。Mac OS XでHFS+を使うと、ファイル名がNFDに似た方式で分解されるのは有名です。
■日本語1文字が7バイト
- UnicodeのBMPの漢字にVSを付けたものをUTF-8で符号化すると、3バイト+4バイトで7バイトになります。たとえば前述の「廣󠄁」(广+黄の”廣”、<U+5EE3,U+E0101> )はE5BBA3F3A08481となり7バイトです。
■日本語1文字が8バイト
- UnicodeのSIPの漢字にVSを付けたものをUTF-16で符号化すると、Base Characterが4バイト(サロゲートペア)+VSが4バイト(サロゲートペア)で、計8バイトになります。たとえば「𤋮󠄁」(臣+己+れんがの”熙”、<U+242EE,U+E0101> )はD850DEEEDB40DD01になります。これをUTF-8で符号化しても、やはり4バイト+4バイトで8バイト(F0A48BAEF3A08481)になります。
残念なことに、今回私が考えた範囲では、日本語1文字が5バイトになるパターンは見つけられませんでした。もしご存知の方がいらっしゃったら、ぜひお知らせください。
あと、ISO/IEC 2022のエスケープシーケンスを使うと、日本語たった1文字を表すだけでも9バイト以上が必要になることがあります。この場合、2文字になったからと言ってバイト数も2倍になるわけではないので、純粋に1文字何バイトとは言えませんが、参考までに載せておきます。
■日本語1文字が9バイト
- JIS漢字をISO-2022-JP-2004で1文字だけ書くとすると、9バイトを必要とします。たとえば「愛」ならJIS X 0213:2004の第1面のエスケープシーケンスの4バイト(1B242851)と、文字部分の2バイト(3026)、それにASCIIに戻すエスケープシーケンス3バイト(1B2842)で、合わせると1B24285130261B2842の9バイトになります。
■日本語1文字が11バイト
- ISO-2022-JPを使う場合でも、JIS X 0208の1990年改訂版を使いたい場合は、文字集合を指示するエスケープシーケンス(1B2442)の前にIRR(Identify Revised Registration、改訂番号を識別に使うエスケープシーケンス)1B2640を置くことになっています。なので、JIS X 0208:1990で追加された2文字のひとつ「熙」を1文字だけISO-2022-JPで書くとすると、1B26401B244274261B2842の11バイトになります。ただし、このIRRを解釈できる実装はほとんど無いと思われます。
ISO/IEC 2022のアナウンス機能や制御機能まで含めれば、規格上はもっと長いエスケープシーケンスもありえますが、現実にそれを解釈できる機器はほとんど存在しないと思うので、この辺でやめておきます。
※更新履歴
- 2013-06-05 IVSC(Ideographic Variation Selector Character)をVS(Variation Selector)に修正