[ 検索ページ | 一覧表示 | ツリー表示 | MLトップ | トップページ ]
[comu-ml 0090] Windows Vista の JIS2004対応について

大河内です.

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

EC-CUBE の場合, どのような影響が考えられるでしょうか.

本業の方(Java)で, Windows Vista での影響調査をする機会があり, いろいろ
調べましたので, ちょっとまとめてみます.

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

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

以下は, Unicode で規定されている文字エンコーディングの抜粋
* 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 単位の可変長. BMP面
        とは, 16bit のみで表現される範囲のことを言い, 16bit + 16bit で
        表現される範囲を「サロゲート領域」と言う

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

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

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

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

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

■ PostgreSQL での扱い
8.1.7以降、8.2.2以降であれば, UTF-8 で問題なく扱える.
それ以前のバージョンは, 1文字4バイトで表現される文字を使用した場合に問
題がでる可能性あり.
http://mlog.euqset.org/archives/pgsql-jp.ml.postgresql.jp/38404.html

ちなみに, Oracle は 10.1.0以降で対応とのことです.

■(参考:オフトピ) Java での問題
char が 16bit であるため, 16bit + 16bit のサロゲート領域が正常に扱えな
い.
具体的には, String#length() や, String#substring() が正常に動作しない.
プロパティファイルなど, \uXXXX で表わすものは 16bit なので, サロゲート
領域の文字は使えない. プロパティファイルを XML で書けば, 任意のエンコー
ディングを使用できるので, サロゲート領域の文字も使用可能

■ EC-CUBE への影響
デフォルトエンコーディングである, EUC-JP の場合, JIS X 0208, JIS補助漢
字(JIS X 0212) を越える範囲の文字が入力された場合, 文字化けしてしまう
可能性がある.
mbstring.http_output が EUC-JP でも, mbstring.internal_encoding を
UTF-8, mbstring.http_input = auto にしておけば,
mbstring.substitute_character = none とすることにより, カットされるは
ず(未検証)

エンコーディングを UTF-8 にしても, DB に MySQL を使用した場合は苦しい
ですね...
1文字4バイトで表現される文字が入力された場合はアウトみたいです.
このことを考えると, 

mbstring.internal_encoding = UTF-8
mbstring.http_input = auto
mbstring.http_output = EUC-JP
mbstring.encoding_transation = On
mbstring.substitute_character = none

としておくのが無難そうです.
DBエンコーディングの種類により, DBへ渡す際にコード変換が必要な場合もあ
り.

PostgreSQL の場合は, UTF-8 を使用することで大きな問題はなさそうです.
8.1.7以降、8.2.2以降なら安心ですね.

■ さらに...
http://itpro.nikkeibp.co.jp/99/vista/index.html
これを見ると, Vista で入力できても, XP 以前では対応していない文字が183
字あり, この中には人名漢字も含まれます.
仮にWebアプリケーション側が Vista にフル対応したとしても, XP では表示
できないというトラブルも発生します.
XP に JIS2004対応フォントをインストールしたりすることで回避できますが,
対応をクライアント側に任せるのもどうかと...

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

# このあたりの問題, EBiS さんはどう対応されているのでしょう?

----------------------------------------------
大河内健太郎(Kentaro Ohkouchi)
E-mail: ohkouchi@loop-az.jp
有限会社Loop AZ
http://www.loop-az.co.jp/
常駐先: 株式会社 SRA
E-mail: z-ohkouc@sra.co.jp
----------------------------------------------


[ 検索ページ | 一覧表示 | ツリー表示 | MLトップ | トップページ ]