2017-01-12 5 views
0

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 
+0

コマンドラインとウェブの両方が同じphp.iniを使用しているかどうかを確認してください。ウェブの場合は 'phpinfo();'、コマンドラインの場合は 'php -ini'を試してください – bansi

+0

私のマシンは同じ' C:\ PHP \ php.ini'を使っています。 prodサーバで 'phpinfo()'は無効になっていますが、私は尋ねます。 – vaso123

+0

'phpinfo()'が無効になっている場合[php_ini_loaded_file](http://php.net/en/function.php-ini-loaded-file.php)が動作するかどうかを確認してください – bansi

答えて

0

あなたはマルチバイト文字列に文字列関数を使用する前に、setlocale機能を使用する必要があります。

+0

を試してみることができますこれは私の質問にどのように関連していますか?まず、 'chr(194)。 chr(160); 'は単に' SHIFT + SPACE'ですが、シフトスペースはドイツ語と英語で何か他のものですか? – vaso123

+0

setlocaleを使うと、現在のプロセスで** encoding **を設定することができます。 –

+0

@ vaso123、 'chr(194)'は拡張ASCIIテーブルからのもので、ロケールとロケールは異なります。 [docs](http://php.net/manual/en/function.strtolower.php)は次のようになります:*「アルファベット」は現在のロケールによって決まることに注意してください。これは例えばデフォルトの "C"ロケールでは、ウムラウト-A(Ä)などの文字は変換されません。* –

関連する問題