18
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-11-28

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');
18
13
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?