デフォルト文字エンコーディング設定の仕様変更はPHP 5.6リリースの際に私が行った変更ですが、ブログで紹介していなかったような気がするので紹介します。PHP 5.5以下のmbstring正規表現デフォルト文字エンコーディングは”EUC-JP”でした。
一応、RFCには
- all functions that take encoding option use php.internal_encoding as default (e.g. htmlentities/mb_strlen/mb_regex/etc)
と書いているのですが、これだけではmb_eregなどのデフォルト文字エンコーディングが変わっている事に気が付かない方も多い(気が付かない方が多い?)と思います。
PHP 5.6のデフォルト文字エンコーディング設定
PHP 5.5以下のデフォルト文字エンコーディング(default_charset)設定は空でした。つまりデフォルトではHTTPヘッダに文字エンコーディングが設定されていませんでした。これはセキュリティ的にも良くない仕様でしたが、様々な理由で空のままになっていました。
PHP 5.6以降からはINI設定の”default_charset”(デフォルトはUTF-8)だけ設定すれば、他の文字エンコーディング関連設定
- mbstring.internal_encoding
- mbstring.http_input
- mbstring.http_output
- iconv.internal_encoding
- iconv.input_encoding
- iconv.output_encoding
- zend.script_encoding
もdefault_charsetと同じ値になるように自動的に設定されます。個別に設定した場合は、個別設定が優先されます。
mbstringの正規表現関数の文字エンコーディング
一応、RFCには
- all functions that take encoding option use php.internal_encoding as default (e.g. htmlentities/mb_strlen/mb_regex/etc)
と書いた通り、mbstringの正規表現関数のデフォルトもこの時見直して修正しています。
PHP 5.5未満では”EUC-JP”がデフォルトで、これはmbstring.internal_encodingとは”独立”して設定できます。mbstring.internal_encodingが設定されている場合、デフォルト値にはその値が利用されます。PHP 5.6以降はdefault_charsetの設定も参照されます。
デフォルトだと以下のような動作になります。
PHP 5.5のmbstring正規表現文字エンコーディング
[yohgaki@dev PHP-5.5]$ ./php-bin -r 'var_dump(mb_regex_encoding());' string(6) "EUC-JP"
PHP 7.0のmbstring正規表現文字エンコーディング
[yohgaki@dev PHP-7.0]$ ./php-bin -r 'var_dump(mb_regex_encoding());' string(5) "UTF-8"
3v4l.orgでも確認できます。
mbstringの正規表現文字エンコーディングも正しく設定!
今更感が半端でないですが、文字エンコーディングが正しく設定しましょう。EUC-JPでもUTF-8の文字列もそれなりに普通に使えて(両方共ISO-8859-1互換なので)しまいますが、本来は正しく設定しないと要らぬ問題の原因になります。
PHP 5.5以下のユーザーの方は是非、mb_regex_encoding関数かmbstring.internal_encoding設定を使って適切な文字エンコーディングを設定してください!
PHP 5.5以下のユーザーの場合、
- default_charset
- mbstring.internal_encoding
最低限この二つは利用している文字エンコーディングを指定する必要があります。
PHP 5.6以上のユーザーでUTF-8をエンコーディングに使う場合、mbstringに限らず、何もする必要はないはずです。