Affamative Way

前向きにグダグダいいながらコード書く

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");

いやーびっくりした。