mb_convert_encodingのautoが危険な理由

  • 53
    Like
  • 5
    Comment
More than 1 year has passed since last update.

mb_convert_encoding ( string $str , string $to_encoding [, mixed $from_encoding ] ) は文字エンコーディングを変換する関数です。

mb_convert_encodingに潜む問題

第3引数の $from_encoding には変換前の文字エンコーディング名を指定しますが、ここを"auto"と指定しておくと、環境によっては

Warning: mb_convert_encoding(): Unable to detect character encoding

のようなエラーが発生し、文字エンコーディングの変換が失敗する場合があります。

ですので、"auto" は極力使わず、文字エンコーディングを指定することをおすすめします。

autoとphp.iniの依存関係

なぜこのようなエラーが発生するかというと、autoはphp.iniの言語設定によって挙動が変わってしまうからです。

"auto" が指定された場合、この文字列は 言語設定 (NLS) ごとに定義されたエンコーディングのリストに変換されます。たとえば、言語設定が Japanese の場合は "ASCII,JIS,UTF-8,EUC-JP,SJIS" です。
http://www.php.net/manual/ja/mbstring.supported-encodings.php

ちなみに言語設定はphp.iniのmbstring.languageに設定してあり、デフォルトは"neutral"が設定してあります。

mb_convert_encodingとうまく付き合うには

autoは使わない

autoは指定せずに適切なエンコーディングを指定しましょう。
autoを指定したい場合は代わりに、"ASCII,JIS,UTF-8,EUC-JP,SJIS"と設定しましょう。

php.iniを変更する

もしくは、php.iniに mbstring.language = Japanese を指定しておけばautoと指定した場合は"ASCII,JIS,UTF-8,EUC-JP,SJIS"として認識されます。
しかし、この方法はphp.iniとの依存関係が強くなるためあまりおすすめできません。

mb_language関数を使用する

php.iniを変更するのが難しい場合は、mb_convert_encodingの前に mb_language("Japanese"); と指定する方法もあります。