Joyent Solaris サーバーでこれまで発生したことのない奇妙なバグに対処しています (localhost または同じ php 構成を持つ他の 2 つの Solaris サーバーでは発生しません)。実際、php と solaris のどちらを調べる必要があるのか、それがソフトウェアの問題なのかハードウェアの問題なのかはわかりません...
誰かが私たちを正しい方向に向けることができる場合に備えて、これを投稿したいだけです.
var_export()
そのため、奇妙なキャラクターを扱う場合に問題があるようです。これを CLI で実行すると、localhost マシンと 2 つのサーバーで期待どおりの結果が得られますが、3 番目のサーバーでは得られません。それらはすべて で動作するように構成されていますutf-8
。
$ php -r "echo var_export('ñu', true);"
古いサーバーとローカルホストでこれを提供します(予想):
'ñu'
しかし、問題が発生しているサーバー ( PHP バージョン => 5.3.6 ) では、\0
è、á、ç などの「一般的でない」文字が検出されるたびに null 文字が追加されます。
'' . "\0" . '' . "\0" . 'u'
どこを見るべきかについて何か考えはありますか?前もって感謝します。
より詳しい情報:
PHP version 5.3.6
.setlocale()
何も解決していません。default_charset
です。UTF-8
_php.ini
mbstring.internal_encoding
に設定されUTF-8
ていphp.ini
ます。mbstring.func_overload = 0
.- これは、CLI (例) と Web アプリケーション (php-fpm + nginx) の両方で発生します。
iconv
エンコーディングもUTF-8
- すべてのファイルが
utf-8
エンコードされます。
system('locale')
戻り値:
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_ALL=
これまでに行われたいくつかのテスト (CLI):
通常の動作:
$ php -r "echo bin2hex('ñu');" => 'c3b175'
$ php -r "echo mb_strtoupper('ñu');" => 'ÑU'
$ php -r "echo serialize(\"\\xC3\\xB1\");" => 's:2:"ñ";'
$ php -r "echo bin2hex(addcslashes(b\"\\xC3\\xB1\", \"'\\\\\"));" => 'c3b1'
$ php -r "echo ucfirst('iñu');" => 'Iñu'
普通でない:
$ php -r "echo strtoupper('ñu');" => 'U'
$ php -r "echo ucfirst('ñu');" => '?u'
$ php -r "echo ucfirst(b\"\\xC3\\xB1u\");" => '?u'
$ php -r "echo bin2hex(ucfirst('ñu'));" => '00b175'
$ php -r "echo bin2hex(var_export('ñ', 1));" => '2727202e20225c3022202e202727202e20225c3022202e202727'
$ php -r "echo bin2hex(var_export(b\"\\xC3\\xB1\", 1));" => '2727202e20225c3022202e202727202e20225c3022202e202727'
したがって、問題は「現在のロケールvar_export()
を使用するがバイト単位で動作する文字列関数」ドキュメント(@hakre の回答を参照) にあるようです。