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

mb_convert_encodingのautoが危険な理由

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

shoyan
野菜作りと庭作りにいそしんでいます。
https://48n.jp
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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした