HOWTO: Как решить проблему ломаной кодировки
Posted: Sun Oct 04, 2009 2:07 pm
1. База данных должна с самого начала создаваться в utf-8. То есть, недостаточно просто создать базу данных, но обязательно ПЕРЕД импортом, когда там еще нет ни одной таблицы, поменять сравнение базы данных на utf8_general_ci. Это можно сделать в PHPMyAdmin в закладке Операции или выполнив команду SQL в консоле или в поле SQL в PHPMyAdmin:
Этот момент часто упускается и с самого начала все встает криво. Выполнение этой команды пост-фактум, когда все уже лежит в базе НИЧЕГО НЕ ДАСТ! В CMS Made Simple, начиная с версий 1.6 эта команда выполняется при установке. Но я советую выполнить ее вручную, если по какой-то причине (отсутствие прав?) эта команда не выполнится при установке.
2. Перед тем, как импортировать базу данных, открываем дамп в тесктовом редакторе и проверяем его на отсутствие кракозябр. Если кракозябры в нем присутсвуют, то импортировать такой файл без изменений ничего не даст, импорт его не вылечит! Кракозябры в дампе возникают либо, если база с самого начала криво была настроена, либо экспорт был выполнен некорректно. Как вылечить кракозябры в дампе? Созданием здорового дампа без кракозябр или заменой кракозябр на соответствующие буквы. Я заменяю простым редактором, в котором можно сделать поиск и замену в тексте. Ищем кракозябру, заменяем на букву.
2a. Независимо от наличия или отстуствия кракозябр, заменяем все
на
Под !!ДРУГАЯ КОДИРОВКА!! может быть latin1 или сp1252 или .... Используем для этого текстовой редактор. Ищем !!ДРУГАЯ КОДИРОВКА!! также по отдельности, и везде заменяем на utf8.
3. Проверяем в какой кодировке файл в этом редакторе сохраняется. В некоторых редакторах можно уточнить кодировку файла при его сохранении. Лучше всего сохранить файл в кодировке utf8, хотя это не так уж и важно. Важно только знать, в какой кодировке файл будет сохранен редактором для следующего шага.
4. При импорте базы данных через PHPMyAdmin выбираем соотвествующую кодировку файла в поле. Гаданием НЕ занимаемся, берем то, что было задано в шаге 3. Если не знаем, в какой кодировке файл был сохранен, то возращаемся к шагу 3 и учимся сохранять файлы в нужной кодировке.
5. После импорта проверяем, чтобы все таблицы, и все текстовые поля в базе имели сравнение utf8_general_ci (колонка сравнение в PHPMyAdmin). Если это не так, то возращаемся к шагу 1 и шагу 2а.
5а. Открываем любую таблицу с текстом и проверяем на наличие кракозябр. Если их НЕ было в дампе, то возращаемся к шагу 3. Если они были в дампе, то возращаемся к шагу 2.
6. Соединение с базой данных должно идти в utf8. Соединение не имеет никакого отношения к сравнению таблиц (колонка сравнение в PHPMyAdmin). Соединение может быть в UTF8, а таблицы в latin-swedish и наоборот. По умолчанию, при установке MySQL на сервере выставляется соединение latin-swedisch и если хостер тупой, то он это значение не изменяет и каждый клиент на сервере начинает биться с кодировками. В CMS Made Simple эта проблема решается выставлением
в файле config.php.
7. Во всех HTML шаблонах должно стоять.
8. Если кракозябры отображаются только в заголовках новостей, то нужно открыть шаблон для новостей, найти все
и заменить на
9. После замены кодировок и нового импорта ВСЕГДА очищаем кэш CMSMS.
Администрирование сайта » Общие настройки, закладка Дополнительные настройки. Кнопка "Очистить кэш".
................................................................................................
Написано для тех, кто хочет понять, почему нет однозначного решения для "ломаной кодировки". Проблема может возникнуть на любом этапе!
...............................................................................................
Вылечился сам - помоги вылечиться другим! Дописываем сюда важные моменты, которые я возможно не учла.
Code: Select all
ALTER DATABASE `database_name` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci
2. Перед тем, как импортировать базу данных, открываем дамп в тесктовом редакторе и проверяем его на отсутствие кракозябр. Если кракозябры в нем присутсвуют, то импортировать такой файл без изменений ничего не даст, импорт его не вылечит! Кракозябры в дампе возникают либо, если база с самого начала криво была настроена, либо экспорт был выполнен некорректно. Как вылечить кракозябры в дампе? Созданием здорового дампа без кракозябр или заменой кракозябр на соответствующие буквы. Я заменяю простым редактором, в котором можно сделать поиск и замену в тексте. Ищем кракозябру, заменяем на букву.
2a. Независимо от наличия или отстуствия кракозябр, заменяем все
Code: Select all
DEFAULT CHARSET=!!ДРУГАЯ КОДИРОВКА!!;
Code: Select all
DEFAULT CHARSET=utf8;
3. Проверяем в какой кодировке файл в этом редакторе сохраняется. В некоторых редакторах можно уточнить кодировку файла при его сохранении. Лучше всего сохранить файл в кодировке utf8, хотя это не так уж и важно. Важно только знать, в какой кодировке файл будет сохранен редактором для следующего шага.
4. При импорте базы данных через PHPMyAdmin выбираем соотвествующую кодировку файла в поле. Гаданием НЕ занимаемся, берем то, что было задано в шаге 3. Если не знаем, в какой кодировке файл был сохранен, то возращаемся к шагу 3 и учимся сохранять файлы в нужной кодировке.
5. После импорта проверяем, чтобы все таблицы, и все текстовые поля в базе имели сравнение utf8_general_ci (колонка сравнение в PHPMyAdmin). Если это не так, то возращаемся к шагу 1 и шагу 2а.
5а. Открываем любую таблицу с текстом и проверяем на наличие кракозябр. Если их НЕ было в дампе, то возращаемся к шагу 3. Если они были в дампе, то возращаемся к шагу 2.
6. Соединение с базой данных должно идти в utf8. Соединение не имеет никакого отношения к сравнению таблиц (колонка сравнение в PHPMyAdmin). Соединение может быть в UTF8, а таблицы в latin-swedish и наоборот. По умолчанию, при установке MySQL на сервере выставляется соединение latin-swedisch и если хостер тупой, то он это значение не изменяет и каждый клиент на сервере начинает биться с кодировками. В CMS Made Simple эта проблема решается выставлением
Code: Select all
#This is a mysql specific option that is generally defaulted to true. Only
#disable this for backwards compatibility or the use of non utf-8 databases.
$config['set_names'] = true;
7. Во всех HTML шаблонах должно стоять.
Code: Select all
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Code: Select all
{$entry->title|escape:'html'}
Code: Select all
{$entry->title|escape:'html':'utf-8'}
Администрирование сайта » Общие настройки, закладка Дополнительные настройки. Кнопка "Очистить кэш".
................................................................................................
Написано для тех, кто хочет понять, почему нет однозначного решения для "ломаной кодировки". Проблема может возникнуть на любом этапе!
...............................................................................................
Вылечился сам - помоги вылечиться другим! Дописываем сюда важные моменты, которые я возможно не учла.