我们正在处理以前从未发生过的 Joyent Solaris 服务器中的一个奇怪错误(在 localhost 或其他两个具有相同 php 配置的 Solaris 服务器中不会发生)。实际上,我不确定我们是否必须查看 php 或 solaris,如果它是软件或硬件问题......
我只是想发布这个,以防有人能指出我们正确的方向。
因此,问题似乎出在var_export()
处理奇怪字符时。在 CLI 中执行此操作,我们在 localhost 机器和其中两台服务器中获得了预期的结果,但在第三台服务器中却没有。所有这些都配置为使用utf-8
.
$ php -r "echo var_export('ñu', true);"
在较旧的服务器和 localhost (预期)中提供此功能:
'ñu'
但是在服务器中,我们遇到了问题(PHP 版本 => 5.3.6),它会\0
在遇到“不常见”字符时添加空字符:è、á、ç、...
'' . "\0" . '' . "\0" . 'u'
关于应该在哪里看的任何想法?提前致谢。
更多信息:
PHP version 5.3.6
.setlocale()
没有解决任何问题。default_charset
UTF-8
在php.ini
. _mbstring.internal_encoding
设置为UTF-8
inphp.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的答案)。