PHPで名前を扱う場合、文字コード指定に注意が必要
CakePHP のおいしい食べ方: EUC-JPではなく、EUCJP-win!!!
お客さんがWindowsを使うと分かっていて、日本語の名前に関するデータ処理をするようなプログラムを書く場合、
$str = mb_convert_encoding($str, "EUC-JP", "UTF-8");
なんてやっちゃだめです。
$str = mb_convert_encoding($str, "EUCJP-win", "UTF-8");
としないと、あとできっと、顧客からクレームが来ます。
知らずに中で使っていて、まさにご指摘いただきました。
具体的にどういうことが起きるかというと。
とか のような文字の文字コードを変換する場合
"-win"って指定してないとその文字が消えるんです。
これ、実はメールの本文の文字コード(ISO-2022-JP)でも同様のことが起きます。
PHP-dev - [PHP-dev 1345] PHP への CP932 系エンコーディングの追加パッチ
このパッチを適用する事により、次の事が実現されます。
1) Windows の機種依存文字をシフトJIS (SJIS-win)、日本語EUC (CP51932、
eucJP-win)、7ビットJIS (ISO-2022-JP-MS) で扱えるようになります。2) Windows 上で作成された Unicode とシフトJIS (SJIS-win)、日本語EUC
(CP51932、eucJP-win)、7ビットJIS (ISO-2022-JP-MS) との間で変換可能
になります。
PHP5.2.1以降ならば、すでにパッチが当たってるので、以下のような書き方でOKです。
<?php // mbstring.internal_encoding euc-JP-win // これだと文字が消えます $result = mb_convert_encoding( $str, "ISO-2022-JP", "euc-JP-win"); // これだとちゃんと表示されます。 $result = mb_convert_encoding( $str, "ISO-2022-JP-MS", "euc-JP-win");
いやーびっくりした。