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 プラットフォームにおける補助文字のサポート

2008-04-16

ちょっと見やすく体裁を修正…

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中