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