PDA

Просмотр полной версии : Проблемы с кодировками


Regis Filius
11.03.2010, 15:09
Не совсем веб-дизайн, но касается.

Обычно я использовал windows-1251 и в своих PHP скриптах без особого труда вручную переводил в utf-8 данные в базу данных и из неё, пока не задумался: "А почему бы не перейти совсем на utf-8 и избавиться от мороки с базой данных?". Сказано - сделано, и следующей кодировкой для небольшой сайта стал именно utf-8

По простоте душевной я полагал, что особой проблемы здесь возникнуть не должно, но постепенно ряд непониманий между мной, кодом и базой данных заставил меня пересмотреть взгляд на проблему с кодировками. Сейчас уже, слава богу, всё идёт нормально, поэтому прилагаю небольшой справочник по тому, что же стоит учитывать при переходе на другую кодировку.

Для начала простая функция перекодирования строк в PHP:
iconv("желаемая кодировка", "предыдущая кодировка", "что переводится.");
Например, следующая функция перекодирует данные в utf-8:
iconv("utf-8", "windows-1251", "ПОПЯЧСО!!!!!");


В целом кодировки следует прописывать в нескольких местах:
1. HTML код.
2. PHP код.
3. База данных (в моем случае MySQL).
4. Кодировка самих скриптов (у меня были .php для php скриптов и .js для javascript).


HTML
Кодировка прописывается в мета-тэгах:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

PHP
Отправляется в заголовках функцией header (заголовки всегда отправляются в самом начале)
header('Content-type: text/html; charset=utf-8');
В дополнении к этому можно ещё добавить:
if (!setlocale(LC_CTYPE ,"ru_RU.UTF-8"))
setlocale(LC_CTYPE,"ru_RU");


MySQL
В базе данных достаточно много настроек, где указывается кодировка, возможно, что я что-то и упустил, но мне хватило следующего:
- Изменение кодировки самой базы данных, таблицы и кодировки сравнения (collation). Всё это легко изменяется с помощью phpMyAdmin.
- Запрос (query) "SET NAMES UTF8", лучше всего сделать это сразу после подключения.
Не забывайте, что в SQL кодировки пишутся немного по-другому.

Скрипты
В любом уважающем себя текстовом редакторе (у меня NotePad++) есть функция перекодирования содержимого, которой надо не забывать время от времени пользоваться. Сам лично маялся довольно долго, пока не догадался перевести все файлы в utf-8.

Естественно, что таким образом можно поставить не только utf-8 :)

rohard
11.03.2010, 15:30
man iconv

Regis Filius
11.03.2010, 18:47
Смысл как раз и в том, чтобы везде кодировка была utf-8 и не надо было прибегать к перекодировке данных.

Strelockk
22.03.2010, 17:43
Обхожусь "Сравнением" в phpmyadmin, браузеру отдаю хидеры с нужной кодировкой, SET NAMES вообще редко пользуюсь, т.к. общесистемная кодировка utf-8 мало приходится прибегать к конвертированию.