EC-CUBEアーカイブ

JIS X 0213:2004(JIS2004) と Java と PHP と RDBMS

ずいぶん前に, EC-CUBE の ML へ投稿した話題ですが, どうも過去ログに埋もれているので, 再度まとめてみます...

Windows Vista で, 日本語の文字集合に, JIS X 0213:2004(JIS2004) が採用されました.
このため, 扱える漢字が増えたり, 字体が変化したりして, さまざまな影響があります.

EC-CUBE を代表する PHP のアプリケーションや, Java の場合, どのような影響が考えられるでしょうか.

以前, Windows Vista での影響調査をする機会があり, いろいろ調べましたので, ちょっとまとめてみます.

文字集合と文字エンコーディングについて

文字のまとまりを規格化できるよう, 各文字に対して一連のコード(文字コード)を割り当てたものを「文字集合(文字セット)」と言います.
これには, Unicode や, JISX 0213:2004 などがあたります.

この文字集合をコンピュータで扱えるよう, 文字コードをバイトコードへ変換する仕組み(文字符号化方式)を文字エンコーディングと言います.
これには, Shift_JIS や, EUC-JP, UTF-8, UTF-16 などがあります.

文字コードと文字エンコーディングと文字セットを混同してしまいがちですが, それぞれの意味は別物です.

UTF-8 というのは, 正確に言うと Unicode という文字セットで規定されている文字エンコーディングの一つです.

Unicode で規定されている文字エンコーディングの抜粋

  • UTF-1 - 8bit
  • UTF-5 - 利用されていない
  • UTF-7 - UTF-16 で表した Unicode を Base64 で変換して表す方式. 非推奨
  • UTF-8 - 8bit 単位の可変長コードにエンコードする方式
    • 1バイト - すべての ASCII
    • 2バイト - JIS X 0208の非漢字の一部
    • 3バイト - Windows-31J の拡張文字エリア全て, 第3・4水準漢字の一部
    • 4バイト - JIS X 0213:2004 の第3・4水準漢字の一部, UnicodeのBMP 面以外すべて
  • UTF-16 - Windows XP, Vista の内部エンコーディング. Vista では, JIS X 0213:2004 の文字集合が採用された. 16bit 単位の可変長. 16bit のみで表現される BMP面と, 16bit + 16bit で表現される「サロゲート・ペア」から構成される.
  • UTF-32 - Unicode の全コードを単一長のコードとして 32bit で指定するコード. 実際に使用されるのは 21bit までの範囲.

Unicode における BMP(Basic Multilingual Plane)面とは, UTF-16 にて, 16bit のみで表現できる領域の文字のことを言い, 16bit + 16bit で表現する文字の範囲を 「サロゲート・ペア」と言います.

Unicode 以外の文字集合としては, UCS-4 (ISO/IEC 1064)という良く似た別物があり, UCS-4 で規定されている文字エンコーディングにも UTF-8 があったりします.

UCS-4 と Unicode は 21bit までの範囲で互換性があります. UCS-4 は4バイトを基本とし, 31bit までの領域を使用します. ややこしい...

一方, JIS X 0213:2004 では, 文字エンコーディングとして, ISO-2202-JP-2004, EUC-JP-2004, Shift_JIS-2004 などがありますが, IANA に登録されていないため, あくまでも参考となっています.

Windows Vista での問題

Windows Vista では, 使用する文字セットに, JIS X 0213:2004 を採用したため, UTF-16 でエンコーディングされる場合, BMP面以外の文字(16bit + 16bit で表現される文字)までサポートされることとなりました.

このため, UTF-8 でエンコーディングされる場合は, 1文字が4バイトで表現される文字も含まれます.

PHPでの扱い

http://jp.php.net/mbstring を見るかぎりは, mbstring 関数を使用することで, サロゲート・ペアの文字が入力されても, うまく対応できそうです.
文字エンコーディングは, UTF-8 が無難でしょう.

MySQL での問題

http://www.mysql.gr.jp/mysqlml/mysql/msg/13823
これを見ると, DBエンコーディングに UTF-8 を使用した場合でも, 扱えるのは, 1文字3バイトまでの範囲に限られるようです...

つまり, Windows Vista で採用されたサロゲート・ペアの文字が入力された場合は, 確実に文字化けします(苦笑)

PostgreSQL での扱い

8.1.7以降、8.2.2以降であれば, UTF-8 で問題なく扱えるようです.
それ以前のバージョンは, 1文字4バイトで表現される文字を使用した場合に問題がでる可能性あります.

http://mlog.euqset.org/archives/pgsql-jp.ml.postgresql.jp/38404.html

Oracle は?

Oracle は 10.1.0以降で対応とのことです.

Java での問題

char が 16bit であるため, 16bit + 16bit のサロゲート・ペアは正常に扱えません...

具体的には, String#length() や, String#substring() が正常に動作しません(苦笑)

プロパティファイルなど, \uXXXX で表わすものは 16bit なので, サロゲート・ペアの文字は使えません.
プロパティファイルを XML で書けば, 任意のエンコーディングを使用できるので, サロゲート・ペアの文字も使用できます.

Java でサロゲート・ペアの文字列を扱うには, Java SE 5.0 以降で追加された API を使います.

サロゲート・ペアが含まれる文字数を正確に数えるには, String#codePointCount() を使ったりします.

文字列のソートとかも工夫が必要です. 手前味噌ですが, 下記にサンプルがあります.
http://d.hatena.ne.jp/nanasess/20070819/1187700166

さらに...

http://itpro.nikkeibp.co.jp/99/vista/index.html
これを見ると, Vista で入力できても, XP 以前では対応していない文字が183字あり, この中には人名漢字も含まれます.

仮にWebアプリケーション側が Vista にフル対応したとしても, XP では表示できないというトラブルも発生します.

XP に JIS2004対応フォントをインストールしたりすることで回避できますが, 対応をクライアント側に任せるのもどうかと...

いちばん良いのは, Vista で問題の文字を入力した場合に警告を出すことでしょうかねえ...

参考

J2SE 5.0 Tiger 虎の穴 Unicode 4.0 の補助文字のサポート

Java プラットフォームにおける補助文字のサポート

EC-CUBE 個人的ロードマップ

4月から, ちょっとだけ余裕が出る(かもしれない)ので, EC-CUBE で個人的にやりたい事を書いておこうと思います.

SC_Query の拡張

開発コミュ ML でポストした PDO対応 SC_Query パッチを作る.

リファクタリング

徹底的にリファクタリングして, 開発チームの A さんや, S さんをマージ地獄に陥れるw

WYSIWYG

Ext JS がやたら良さそうなので, テンプレート編集画面を WYSIWYG にする.

Safari 対応

Windows 版の Safari も出たことだし, 管理画面を Safari 対応にする.

どれだけやれるか不明ですが, 宣言しておかないとやれそうもないので, 宣言しておくことにします...