mbstring正規表現デフォルト文字エンコーディングは”EUC-JP”だった

(Last Updated On: 2018年8月13日)

デフォルト文字エンコーディング設定の仕様変更は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に限らず、何もする必要はないはずです。

 

 

投稿者: yohgaki