5台のマシンがあります。strtolwerマルチバイト文字を使用する異なる環境でstrtolwerが動作する
マインはwin10 64bit、php 5.6、プロダクションサーバは最新のdebian 64bitで、PHP 5.6です。
2台のマシンの両方で同じスクリプトを実行し、同じ結果を得ます。奇妙なのは、Webからのスクリプトとコマンドラインからのスクリプトの実行の違いです。
コード:
$string = chr(194) . chr(160);
var_dump($string);
var_dump(bin2hex($string));
var_dump(bin2hex(strtolower($string)));
var_dump(bin2hex(mb_strtolower($string)));
ウェブからの出力:
string(2) " "
string(4) "c2a0"
string(4) "c2a0"
string(4) "c2a0"
ストレンジは、両方のマシンは、コマンドラインで同じことを行うとすると、次のとおりです。何らかの理由で
string(2) " "
string(4) "c2a0"
string(4) "e2a0" <-- Listen this!
string(4) "c2a0"
strtolowerがUTF8 charの最初のバイトを変更しました。
私のcolleagugeには、PHP7、64ビットCentOS、PHP7、そしてCentOS 64bit PHP 5.3.3のマシンがもう1台あります。
しかし、これらのマシンはどこでもc2a0
をダンプします。もちろん、UTF8文字セットはあらゆる場所で使用されています。
これはどうしてですか?
EDIT:生産に対する
:setlocale(LC_ALL,0);
コマンドライン:ウェブから
LC_CTYPE=en_US;LC_NUMERIC=C;LC_TIME=C;LC_COLLATE=C;LC_MONETARY=C;LC_MESSAGES=C;LC_PAPER=C;LC_NAME=C;LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=C;LC_IDENTIFICATION=C
:私のlocalhostのマシンで
string(1) "C"
:
ウェブから:
string(1) "C"
コマンドライン:
LC_COLLATE=C;LC_CTYPE=Hungarian_Hungary.1250;LC_MONETARY=C;LC_NUMERIC=C;LC_TIME=C
コマンドラインとウェブの両方が同じphp.iniを使用しているかどうかを確認してください。ウェブの場合は 'phpinfo();'、コマンドラインの場合は 'php -ini'を試してください – bansi
私のマシンは同じ' C:\ PHP \ php.ini'を使っています。 prodサーバで 'phpinfo()'は無効になっていますが、私は尋ねます。 – vaso123
'phpinfo()'が無効になっている場合[php_ini_loaded_file](http://php.net/en/function.php-ini-loaded-file.php)が動作するかどうかを確認してください – bansi