yamaokaです。
PHPで日本語を扱う場合、mbstringモジュールを利用する場合が多いと思います。 日本語に特有の機能(カタカナの全角/半角変換など)も備わっていて、とても便利です。 しかし、日本以外ではmbstringモジュールはあまり利用されていないようです。 代わりに利用されているのがiconvモジュールで、 最近話題のフレームワーク、symfonyでも 国際化の機能を実現するために内部で利用されています。
iconvモジュールはPHP 5でPHPの本体に組み込まれました。 別途用意して組み込む必要があるmbstringモジュールと違って、最初から使用できるので便利ですね。 PHPのマニュアルのiconv関数のページを見ると、 いくつかの関数が定義されているのがわかります。 それぞれ、mbstring関数との 対応表を作ってみました。
iconv関数 | mbstring関数 |
---|---|
iconv_get_encoding | mb_http_input, mb_http_output, mb_internal_encoding |
iconv_mime_decode_headers | mb_decode_mimeheader |
iconv_mime_decode | mb_decode_mimeheader |
iconv_mime_encode | mb_encode_mimeheader |
iconv_set_encoding | mb_http_output, mb_internal_encoding |
iconv_strlen | mb_strlen |
iconv_strpos | mb_strpos |
iconv_strrpos | mb_strrpos |
iconv_substr | mb_substr |
iconv | mb_convert_encoding |
ob_iconv_handler | mb_output_handler |
mbstring関数は上に挙げた関数以外にも定義されているので、mbstring関数の方が機能的には豊富です。 また、php.iniで設定できる内容の対応表も作ってみました。
iconvセクション | mbstringセクション |
---|---|
iconv.input_encoding | mbstring.http_input |
iconv.internal_encoding | mbstring.internal_encoding |
iconv.output_encoding | mbstring.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がサポートされます。日本語の取り扱いも変わってくると思われるので、要チェックですね。
以下追記です:
- iconv関数自体はPHP 4のころから存在します。PHPに標準で組み込まれるようになったのがPHP 5からです。
- Linuxだとglibcのiconvでcp932がサポートされており、使用可能のようです。
- 日本語とPHPについてもっと詳しく知りたい方は、書籍の『超・極める! PHP』がお勧めです。