[PHP-dev 1396] php.ini での mbstring.substitute_character の設定について
komura
komura.db2r1e @ gmail.com
2008年 5月 3日 (土) 02:18:20 JST
komura です。
substitute_character は、無効な文字を代替する文字を定義する
mbstring の内部変数ですが、調べていると、気になる点がありました
ので、報告します。
1. php.ini で mbstring.substitute_character = none を設定しても、
内部変数には反映されない
PHP マニュアルでは、設定例として、以下のように記載されています
が、実際にはそのようにはなりません。未設定状態になります。
http://php.net/manual/ja/mbstring.configuration.php
mbstring.substitute_character = none ; 文字を出力しない
現状では、php.ini で substitute_character に none(代替文字を
出力しない)を設定するには、以下のようにする必要があります。
mbstring.substitute_character = "none"
原因は、ini ファイルで none を設定すると、0(null) に変換されて
しまうためのようです。
substitute_character が未設定の場合、substitute_character には
63("?") が設定されます(mb_get_info() で確認)。
2. PHP マニュアルの記述と実際の処理に違いがあるように見える
PHP マニュアル(http://php.net/manual/ja/mbstring.configuration.php)
では、mbstring.substitute_character のデフォルト値が NULL になって
います。
上記のページでは、NULL の場合はどのようになるのかを明記されて
いませんが、以下のページでは、NULL は「文字を出力しない」と書かれ
ています(http://php.net/mb_substitute_character)。
実際には、1. のように、デフォルト値として 63("?") が設定されます
(ext/mbstring/mbstring.c で定義)。
これらの問題について、修正すべきかどうかは分かりませんが、私の
意見としては、以下の通りです。
1. に関しては、PHP マニュアルに書かれている通りに設定できた方が
良いと思います。PHP のソースコードを読むと、修正方法によっては、
デフォルトの挙動が大きく変わってしまうため、安易に修正するは
止めておいた方が良いように感じました。
2. に関しては、PHP マニュアルに、substitute_character が未設定の
場合、63 に設定されることを明記し、php.ini のコメントアウト部分を
修正する方が良いのではないかと思います
(mbstring.substitute_character = none の部分を
mbstring.substitute_character = 63 に修正)。
理由としては、php.ini のコメントアウト部分は、デフォルト設定だ
と思ってしまうためです。
substitute_character は、文字列変換関数などで大きな影響を与える
ため、デフォルトを none にするのは止めておいた方が良いと思い
ます。
現在、調査中ですが、substitute_character を none に設定すると、
文字エンコーディングの変換時に不正な文字列が存在した場合の
カウント(illegal_chars)が行われないようです。
--
komura <komura.db2r1e @ gmail.com>
PHP-dev メーリングリストの案内