По дате Июль 23rd, 2010

utf-8, mysql и буквы ш, И - некорректно отображаются буквы

На некоторых конфигурациях хостинга php вместо буквы “ш” (вообще, такой недостаток есть у двух букв - «ш» маленькая и «И» большая) выдавал “ерунду” - две кракозябры (видимо, непечатаемые символы). Иногда (возможно, после применения iconv) слова, содержащие букву “ш” вообще могли “пропасть”. Сайт в кодировке utf-8, база - также в utf-8. Проблема оказалась не в php (под подозрением находился iconv - на некоторых хостингах бывали проблемы с функциями перекодировки).

После сравнительно недолгих поисков выяснилось, что  «ш» и «И», словно заколдованные буквы могут некорректно работать с базой в кодировке utf-8.

Решить все удалось очень просто - после соединения с базой нужно установить кодировку для:
SET CHARACTER SET ‘utf8′ –(этот вариант нашел в рекомендациях на нескольких форумах)
SET NAMES ‘utf8′ –(этот вариант помог)

(важно! именно utf8, а не utf-8 - вариант с дефисом как раз и выдавал результат)

Можно “подглядеть”, что творится на сервере с кодировками:

mysql> show variables like '%char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

php и utf8 - http://www.phpwact.org/php/i18n/utf-8

После переноса или смены кодировки некоторые буквы “ш” и “И” в UTF-8 могут отображаться неверно
буква “ш” = chr(209).chr(63) / правильно chr(209).chr(136)
буква “И” = chr(208).chr(63) / правильно chr(208).chr(152)
Для решения проблемы выполняем запросы (в phpmyadmin)

UPDATE `table` SET `field` = REPLACE(
`field`,
CONCAT( CHAR(209), CHAR(63) ),
CONCAT( CHAR(209), CHAR(136) )
);

UPDATE `table` SET `field` = REPLACE(
`field`,
CONCAT( CHAR(208), CHAR(63) ),
CONCAT( CHAR(208), CHAR(152) )
);

Опубликовано Июль 23, 2010 | автор: levik  |  Комментарии (4) »