Japanese Code in Java
Java における日本語コード
(Java, UNICODE and Utf-8)
Copyright (c) 1998-1999 by Hirofumi Fujii
(Date: 09-Feb-1998, LastUpdate: 06-Aug-1999)
注:この文章は、筆者が
Java Virtual Machine Specification を調べた情報、及び
テストプログラムを使って調べた情報等を基にしていますが、筆者の
理解不足による誤解、誤読、また、その後の specification の変更
などがあるかも知れません。必ずしも正確では無いことをご承知おき
下さい。
Java Virtual machine において、一般に文字列定数は constant pool に
置かれる。java.lang.string 型の constant object は、この constat pool
に置かれた文字列を参照する。constant pool 中では、文字列は
Utf8 形式で格納されている。Utf8 形式は任意の長さの
ビット列を可変長で格納する形式である(ただし Java では Utf8
を制約のある形で使っている)らしいが、筆者は正式の規格は見た
ことがないので[注1]、
Java Virtual machine に書かれた記述を基に述べる。
Java では日本語文字列に限らず、文字列は Unicode (UCS-2) で扱われる。
従って、class file (の constant pool)中に格納されている
文字列は Unicode である。Unicode (UCS-2) は 2octets-1byte の文字
コードであるので、これをそのままファイルに格納したり
通信システムへ流すと、次の問題を生じる。
- 従来 1 octet で表されていた ASCII 文字などがすべて 2 octets に
なり、無駄が非常に多くなる。
- 通信システムでは一般に 1バイト 7bits または 8bits であり、制御
コードも、この仮定の下に決められているものが多い。Unicode の一部が
これと衝突する。
これらの問題を避けるために、Java では Unicode (UCS-2) を Utf8 形式
で格納している。
Utf8 形式
先に述べたように、筆者は Utf8 の正式な規格を
知らない[注1]。ここに述べて
いるのは、Java Virtual Machine Specification に記述されている情報を
基にしている。
さて、Unicode (UCS-2) は 2octets 1byte コードである。これを従来の
文字コード(図形文字コード、制御文字コード)系と衝突しないように、
次のように Unicode を変換する。
- Unicode の 0x0001 から 0x007f は、8bit 目を 0 にして、下 7bits
を Unicode の下 7bits にした 1 octet。
- Unicode の 0x0080 から 0x07ff 及び 0x0000 は、第 1 octet は
8-6bit目を 110 にして、下 5bits に Unicode の 11-7bit を埋め、
第 2 octet は、8-7bit目を 10 にして、下 6bits に Unicode の 6-1bit を
埋めた 2 octets。
- Unicode の 0x0800 から 0xffff は、第 1 octet は 8-5bit目を
1110 にして、下 4bits に Unicode の 16-13bit を埋め、第 2 octet は
8-7bit目を 10 にして、下 6bits に Unicode の 12-7bit を埋め、第 3 octet
は 8-7bit目を 10 にして、下 6bits に Unicode の 6-1bit を埋めた 3 octets。
UTF-8 の規格について(06-Aug-1999)
その後、UTF-8 の規格について判明したことを記載しておく。
UTF-8 は、
- ISO/IEC 10646-1:1993,AMD2:1996 に規格化されている
ようである(筆者は見ていない)。
- RFC 2279 にも記述されている。
この規格と、上に述べた方法(Javaでの表現)との
違いは Unicode の 0x0000 の扱いだけのようである。