PHPの文字エンコーディングでEUC-JPからUTF-8へ変換した時に色々ハマったのでメモ。
今までeucJP-winとSJIS-winを使っておけばOKって思ってたけど、実際は色々違うみたい。

検証する文字列

纊あいa忞寬①㈱Ⅲ㌔髙アイウ

検証した時に使ったコード

$str = "纊あいa忞寬①㈱Ⅲ㌔髙アイウエオ";
echo "EUC-JP > UTF-8\n";
echo 'EUC-JP    = ' . mb_convert_encoding($str, 'UTF-8','EUC-JP') . "\n";
echo 'eucJP-win = ' . mb_convert_encoding($str, 'UTF-8','eucJP-win') . "\n";
echo 'CP51932   = ' . mb_convert_encoding($str, 'UTF-8','CP51932') . "\n";
echo "\n";
echo "EUC-JP > SJIS\n";
echo 'EUC-JP    = ' . mb_convert_encoding($str, 'SJIS','EUC-JP') . "\n";
echo 'eucJP-win = ' . mb_convert_encoding($str, 'SJIS','eucJP-win') . "\n";
echo 'CP51932   = ' . mb_convert_encoding($str, 'SJIS','CP51932') . "\n";
echo "\n";
echo "EUC-JP > SJIS-win\n";
echo 'EUC-JP    = ' . mb_convert_encoding($str, 'SJIS-win','EUC-JP') . "\n";
echo 'eucJP-win = ' . mb_convert_encoding($str, 'SJIS-win','eucJP-win') . "\n";
echo 'CP51932   = ' . mb_convert_encoding($str, 'SJIS-win','CP51932') . "\n";

検証した結果

EUC-JP    > UTF-8           = ?あいa???????アイウエオ 
eucJP-win > UTF-8           = あいa①㈱Ⅲ㌔アイウエオ 
CP51932   > UTF-8           = 纊あいa忞寬①㈱Ⅲ㌔髙アイウエオ ○ 

EUC-JP    > SJIS            = 纊あいa忞寬①㈱Ⅲ㌔髙アイウエオ ○ 
eucJP-win > SJIS            = ?あいa???????アイウエオ 
CP51932   > SJIS            = ?あいa???????アイウエオ 

EUC-JP    > SJIS-win(CP932) = 纊あいa忞寬①㈱Ⅲ㌔髙アイウエオ ○ 
eucJP-win > SJIS-win(CP932) = あいa①㈱Ⅲ㌔アイウエオ 
CP51932   > SJIS-win(CP932) = 纊あいa忞寬①㈱Ⅲ㌔髙アイウエオ ○ 

まとめ

結構個人的にはびっくりな結果だった。
特にEUC-JP > SJISが上手くいっていたのは面白かったな。
CP51932というのは、マイクロソフトが定義したEUC-JPのコードセットみたいで、今回はEUC-JPやeucJP-winの代わりにコイツを使うことで文字化けを回避することが出来た。
けど、これを使って解決ってのは、ユーザーがWindowsでEUCな文字コードで入力した時に限るので、昨今のMacの人気からこれだけじゃ対応出来ないことも出てきそう。

他のPHPがサポートする文字エンコーディングを見ていると、SJIS-macとかUTF-8-DOCOMOとか頭がおかしいとかしか思えない名前もちらほらあるので、先が思いやられた。 つか、真面目に対応するのアホらしすぎる。
UTF-8は荒らさないで欲しかったけどさ・・・。

つうことで、メモメモ。