Edited at

mb_convert_encoding()でautoを使用するときの注意点

More than 1 year has passed since last update.

PHPでファイルのエンコードをUTF-8に変換する際に、

mb_convert_encording()の挙動で引っかかった部分があったのでここで共有する。

結論から言うと、

mb_convert_encording()を使用するとき、

$from_encodingの値を'auto'にするのは避けたほうがよい。


問題

以下のように、任意のエンコードからUTF-8に変換しようすると、

PHPがエンコードを認識できず、変換できないときがある。

$str = mb_convert_encoding ($str , 'UTF-8', 'auto');

// >> Warning: mb_convert_encoding(): Unable to detect character encoding


原因

$from_encodingの値を'auto'にした場合、PHPでは次のような振る舞いをする

らしい。


この文字列は 言語設定 (NLS) ごとに定義されたエンコーディングのリストに変換されます。

たとえば、言語設定が Japanese の場合は "ASCII,JIS,UTF-8,EUC-JP,SJIS" です。


裏を返せば、言語設定が Japanese でなかった場合に "ASCII,JIS,UTF-8,EUC-JP,SJIS"に変換されないということである。

実際にphp.iniの言語設定を調べてみたところ、デフォルトの設定である

neutralになっていた。

$ php -i

mbstring.language => neutral => neutral


解決策

解決するために、


  • php.iniの設定を修正する影響範囲の広さ

  • プログラムがphp.iniに依存しないこと

の二点を鑑みて、

$from_encoding'auto'ではなく、

"ASCII,JIS,UTF-8,EUC-JP,SJIS"を使用することにした。

$str = mb_convert_encoding ($str , 'UTF-8', 'ASCII, JIS, UTF-8, SJIS');