Мы имеем дело со странной ошибкой на сервере Joyent Solaris, которая никогда не случалась раньше (не происходит на локальном хосте или двух других серверах Solaris с идентичной конфигурацией php). На самом деле, я не уверен, нужно ли нам смотреть на php или solaris, и это программная или аппаратная проблема ...
Я просто хочу опубликовать это на тот случай, если кто-нибудь может указать нам правильное направление.
Итак, проблема, кажется, в var_export()
при работе со странными персонажами.
Выполняя это в CLI, мы получаем ожидаемый результат на наших локальных машинах и на двух серверах, но не на третьем. Все они настроены на работу с utf-8
.
$ php -r "echo var_export('ñu', true);"
Дает это на старых серверах и localhost (ожидается) :
'ñu'
Но на сервере, с которым у нас возникают проблемы ( PHP Version => 5.3.6 ), он добавляет \0
нулевые символы всякий раз, когда встречает «необычный» символ: è, á, ç, ... вы называете это.
'' . "\0" . '' . "\0" . 'u'
Есть идеи о том, на что следует смотреть? Заранее спасибо.
Подробнее:
PHP version 5.3.6
.
setlocale()
ничего не решает.
default_charset
- это UTF-8
in php.ini
.
mbstring.internal_encoding
установлен на UTF-8
в php.ini
.
mbstring.func_overload = 0
.
- это происходит как в CLI (пример), так и в веб-приложении (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()
и "строковых функциях, которые используют текущую локаль, но работают побайтово" Документы ( просмотреть @ ответ Хакре).