unoh.github.com

日本語とPHP

Sun Mar 04 18:50:17 -0800 2007

yamaokaです。

PHPで日本語を扱う場合、mbstringモジュールを利用する場合が多いと思います。 日本語に特有の機能(カタカナの全角/半角変換など)も備わっていて、とても便利です。 しかし、日本以外ではmbstringモジュールはあまり利用されていないようです。 代わりに利用されているのがiconvモジュールで、 最近話題のフレームワーク、symfonyでも 国際化の機能を実現するために内部で利用されています。

iconvモジュールはPHP 5でPHPの本体に組み込まれました。 別途用意して組み込む必要があるmbstringモジュールと違って、最初から使用できるので便利ですね。 PHPのマニュアルのiconv関数のページを見ると、 いくつかの関数が定義されているのがわかります。 それぞれ、mbstring関数との 対応表を作ってみました。

iconv関数mbstring関数
iconv_get_encodingmb_http_input, mb_http_output, mb_internal_encoding
iconv_mime_decode_headersmb_decode_mimeheader
iconv_mime_decodemb_decode_mimeheader
iconv_mime_encodemb_encode_mimeheader
iconv_set_encodingmb_http_output, mb_internal_encoding
iconv_strlenmb_strlen
iconv_strposmb_strpos
iconv_strrposmb_strrpos
iconv_substrmb_substr
iconvmb_convert_encoding
ob_iconv_handlermb_output_handler

mbstring関数は上に挙げた関数以外にも定義されているので、mbstring関数の方が機能的には豊富です。 また、php.iniで設定できる内容の対応表も作ってみました。

iconvセクションmbstringセクション
iconv.input_encodingmbstring.http_input
iconv.internal_encodingmbstring.internal_encoding
iconv.output_encodingmbstring.http_output

php.iniで設定することができる内容もmbstringモジュールの方が多く、 iconvモジュールで実現できることはmbstringモジュールと比較すると かなり制限があることがわかります。

また、サポートされているエンコーディングの種類が異なります。

mbstringモジュールでサポートされているエンコーディングは、 mb_list_encodings関数などで確認することができます。 また、マニュアルにも詳細に記載されています。 SJIS-winやeucJP-winなど、Windows特有のエンコーディングにも対応しています。

それに対して、iconvモジュールでサポートされる文字セットはOSのiconvライブラリの実装に依存します。 詳細はlibiconvのサイトを参照してください。 ここで注意すべきなのは、Windows上で扱われる文字セット(cp932など)がサポートされていないことです。 この場合、全角のローマ数字などが正常に変換されない場合があるので注意が必要です。 この件に関しては、Samba国際化プロジェクトのページ に詳しくまとめられているので参考になります。

上記のような現状から考えると、mbstringモジュールを利用することが日本語を扱う一番の早道です。 ですが、オープンソースのプロジェクトなどでmbstringモジュールの使用を前提にできない場合、iconv関数を利用する必要があるかもしれません。 また、個人的に海外のレンタルサーバなどを利用する場合は、mbstringエミュレータjcode.phpを利用するのがお勧めです。 mbstringとほぼ同等の機能を、ライブラリとして利用することができます。

PHP 6ではInternational Components for Unicode(ICU)を利用して Unicodeがサポートされます。日本語の取り扱いも変わってくると思われるので、要チェックですね。

以下追記です: