Help us understand the problem. What is going on with this article?

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

More than 3 years have 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');
nito128
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away