У нас есть приложение, размещенное как на локальном сервере разработки, так и на работающем сайте. У нас возникают проблемы с коррупцией в UTF-8, и мы ищем способы их решения.
Система работает с использованием Symfony 1.0 с Propel.
На нашем сервере разработки мы используем PHP 5.2.0 и MySQL 5.0.32. Мы не видим там поврежденных символов UTF-8.
На нашем работающем сайте работают PHP 5.2.10 и MySQL 5.0.81. На этом сервере некоторые символы, такие как ố и Σ , будут повреждены после их сохранения в базе данных. Поврежденные символы отображаются в виде вопросительных знаков или приближений исходного символа с соседними вопросительными знаками.
Примеры коррупции:
Не повреждено: ố
Поврежден: ô?
Не повреждено: Σ
Поврежден:?
В настоящее время мы используем следующие методы как на серверах разработки, так и на живых серверах:
Выполнение следующих запросов перед выполнением любых других запросов:
SET NAMES 'utf8' COLLATE 'utf8_unicode_ci'
SET CHARSET 'utf8'
Установка значения <meta>
Content-Type на:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Добавление следующего к нашему файлу .htaccess:
AddDefaultCharset utf-8
Использование mb_*
(многобайтовых) функций PHP там, где это необходимо.
Обязательно установите столбцы базы данных для использования сортировки utf8_unicode_ci.
Этих методов достаточно для нашего сайта разработки, но они не работают на живом сайте.
На живом сайте я также пытался добавить mysql_set_encoding('ut8', $mysql_connection)
, но это тоже не помогает. Я нашел доказательства того, что более новые версии PHP и MySQL неправильно обрабатывают кодировки символов UTF-8.