[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 メーリングリストの案内