62
59

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が危険な理由

Posted at

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"); と指定する方法もあります。

62
59
5

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
62
59

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?