Периодическая проблема с символами UTF-8

Я использую довольно стандартный стек LAMP.

Проблема заключается в периодической корректной отрисовке символов UTF-8. Примерно в 50% случаев символы, отличные от ASCII UTF-8, отображаются правильно (например, с соответствующими диакритическими знаками), но примерно в 50% случаев я получаю '?' вместо этого исполнение. Если я перезагружаю страницу, иногда это исправляет проблему, а иногда нет. Это происходит со всеми браузерами на всех платформах, что предполагает проблему с MYSQL или Apache, но я не смог понять это.

Сама база данных находится в формате UTF-8, и я никогда не видел проблем при просмотре базы данных в phpMyAdmin.

Я запускаю команду SET NAMES utf-8 при открытии базы данных (и пытался изменить ее на команду SET CHARSET utf-8) без везения.

Что меня смущает, так это то, что это прерывисто, происходит полосами, например. это будет происходить на 30 страницах подряд (даже если они просто перезагружаются), потом на 10 страницах проясняется, потом повторяется на несколько страниц и т.д.

Вы можете попытаться увидеть проблему, нажав кнопку «список» здесь: http://latin-words.com/list_vocab.php, хотя может потребоваться много перезагрузок, чтобы это произошло или чтобы оно исчезло

Конфигурация сервера: Ubuntu: 9.10 Mysql: 5.1.37 PHP 5.2.10 Apache 2.2.12

Любые подсказки будут очень признательны?


person gniss    schedule 30.09.2010    source источник


Ответы (1)


редактировать:
Ради поисковиков, судя по комментариям, проблема была на самом деле в том, что я делал SET NAMES utf-8; (неверно) вместо SET NAMES utf8; (правильно). Это не означает, что я опубликовал гораздо более неясную причину ниже тоже не может быть причиной ;)


Похоже на проблему с локалями и iconv, попробуйте определить локаль используется в процессе веб-сервера в тот момент, когда все хорошо, и в тот момент, когда он больше не работает (попробуйте $currentlocale = setlocale(LC_ALL,NULL); или $currentlocale = setlocale(LC_CTYPE ,NULL);, чтобы получить используемую локаль).

person Wrikken    schedule 30.09.2010
comment
Я не уверен, что понимаю ваш ответ ... вы думаете, что Apache периодически меняет локаль? - person gniss; 30.09.2010
comment
Да, что-то (может быть процесс PHP, не обязательно текущий) меняет локаль, которая выдержит последующие запросы в процессе веб-сервера, который обычно обслуживает выход из нескольких страниц. У меня была точно такая же проблема, которую вы описали, и виновником было упомянутое locale изменение. Но проверьте сами: просто повторите вывод двух опций, которые я вам дал, и проверьте их на различия/согласованность с правильным и неправильным отображением символов. - person Wrikken; 30.09.2010
comment
Он показывает локаль C независимо от того, присутствует проблема или нет. - person gniss; 01.10.2010
comment
Хм, странно, мог бы поклясться, что это было оно. '? Здесь обычно не проблема с неправильным набором символов (например, заявление об отправке одного, но обслуживание другого), а скорее приведение к недостаточному набору символов, поэтому символы заменяются. Есть ли в вашем коде места, где вы переключаете наборы символов (iconv, mb_convert_encoding и т. д.? Единственным другим местом может быть неправильный набор символов для подключения к базе данных (ascii, latin1 и т. д.). Вы получаете какие-либо ошибки при выпуске SET NAMES utf8;?Выдает ли show variables like '%char%'; ожидаемый результат? - person Wrikken; 01.10.2010
comment
Вы прекрасны! Спасибо. Это была проблема UTF-8 и UTF8. Я понятия не имею, почему это иногда срабатывало, но это, кажется, прояснило ситуацию. - person gniss; 01.10.2010