PHP Кодировка страницы
Здравствуй уважаемый читатель блога,
кодировка веб страницы это очень интересный зверь, и за частую хищный
для начинающих веб мастеров. Я уверен в том, что все новички
сталкиваются с проблемой правильного отображения текста на страницах
своего сайта. Ты дорогой читатель, наверное встречал в сети интернета
ресурсы, на страницах которых отображался не читаемый текст, а
кракозябры.
Кракозябрами в среде программирования веб сайтов принято называть
символы не соответствующие тем, которые должны быть выведены на
страницу. Например, на созданной вами странице должно отображаться
приветствие: «Здравствуй читатель моего блога!», а на деле получаете непонятный набор закорючек «Р—РґСЂР°РІСЃС‚РІСѓР№ читатеРСЊ моего Р±РРѕРіР°!» – вот такие закорючки и есть злые КРАКОЗЯБРЫ.
В данной статье мы разберем эту проблему с ног до головы, чтобы
больше не возвращаться к танцам с бубном вокруг нечитаемого текста.
И так, чтобы понять откуда появляются подобного рода иероглифы, нам нужно познакомиться с понятием кодировка страницы.
Любой текст на компьютере представляется в виде набора байтов, в
каждом из этих байтов определенным кодом – закодирован только один
единственный символ. Так вот для того чтобы правильно расшифровать или
раскодировать набор байтов и представить его в понятном человеку виде,
браузеру нужно провести соответствие с одной из кодовых таблиц. Базовой
кодировкой является ASCII кодировка, она содержит в себе коды 128 символов латинского алфавита и спец символов вроде скобок и решеток. Именно из ASCII появились первые русскосимвольные кодировки CP866 и KOI8-R, а из них вышла известная сегодняшним вебмастерам кодировка windows-1251.
Не смотря на то, что все эти кодировки призваны для отображения
русского текста, они все отличаются друг от друга кодами для одинаковых
символов. Если текст писался в кодировке CP866, а браузер пытается раскодировать ее с помощью таблицы кодов windows-1251, то в результате мы получим не читаемые слова. Такое часто происходит при отправке сообщений через почтовый сервер.
Приведенные здесь названия кодировок далеко не все что существуют и
используются в разных случаях, их намного больше чем вы думаете. С таким
обилием кодовых таблиц образовалась проблема совместимости кодировок, и
веб мастерам пришлось вставть на борьду с универсализацией кода, что
занимало много времени и нервов. На сегодняшний день изобретена панацея
для данной проблемы в виде универсальной кодировки utf-8,
со временем она вытесняет используемые ранее кодовые таблицы символов, и
сейчас уже не для кого не встает вопрос о том в какой кодировке лучше
сохранять данные.
Много было сказано относительно эволюции кодировок, и постановке самой задачи, пришло время поговорить о практических моментах.
Существует четыре места на кухне программирования сайта, которые требуют соблюдения единого стандатра кодирования текста.
- Кодировки скриптов.
- Кодировка таблиц MySQL.
- Кодировка самой HTML страницы.
- Локаль используемая браузером пользователя.
Во всех этих составляющих сайта, должна использоваться единая
кодировка, какая – решать вам, но я рекомендую utf-8, всетаки она
универсальная)
И так теперь подробнее рассмотрим, что нужно сделать для того, чтобы привести к одной кодировке всеперечисленые составляющие.
Кодировки скриптов (шаг 1)
Для того чтобы все скрипты имели одну кодировку, нужно при создании
нового скрипта указать желаемую кодировку в настройках вашего
редактора. Приведу пример данной процедуры в NotePad++ . При создании нового PHP файла сразу идем в раздел Encoding, он находится в меню, и выбираем Convert to UTF-8 without BOM.
Выбираем именно Convert to UTF-8 without BOM, а не просто Convert to UTF‑8. Приставка without BOM
означает то что в первых двух байтах файла будет зашифрована
специальная информация о параметре кодировки, в скриптах нам не нужна
никакая лишняя информация. В большенстве случаев сохранение с BOM не
окажется криминальным, но когданить один из скриптов откажется правильно
работать и одной из причин может отазаться именно информация
заключенная в первых байтах файла.
Кодировка таблиц MySQL. (шаг 2)
Для того, чтобы узнать какие кодировки используются в ваше MySQL
базе, воспользуемся интерфейсом phpMyAdmin. В разделе SQL напишем
запрос:
1
| SHOW VARIABLES LIKE 'char%'; |
Выглядеть это должно вот так:
Жмем ОК и получаем информацию о кодировках таблицы
Значения на против character_set_client и character_set_results
должны совпадать, так как эти параметры отвечают за кодировку, в
которой данные поступают в базу и за кодировку в которой данные берутся
из базы.
Если они у вас различаются, то нужно в PHP коде в ручную установить нужную кодировку. Делается это вот такой строчкой:
1
| mysql_query('SET names "utf8"'); |
После этого три переменные character_set_client, character_set_connection и character_set_results примут значение utf8.
Подробнее о том как с помощью PHP работать с базой данных можно прочесть в статье PHP работа с базой данных (Часть 1-3).
Кодировка самой HTML страницы. (Шаг 3)
Теперь данные взятые с базы и данные обрабатываемые в php скрипте,
будут совпадать по кодировке, и выводиться в понятном для человека
тексте. Но это еще не все, нужно указать кодировку в разделе для мета
тегов:
1
| <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> |
Либо в cкрипте настроек php командой:
1
| header('Content-Type: text/html; charset= utf-8'); |
Если кодировка HTML будет задана сразу двумя способами, то приоритетным будет задание кодировки из php скрипта.
Также можно глобально задать правило кодировки HTML в файле .htaccess добавив в него строку:
1
| AddDefaultCharset UTF-8 |
Локаль используемая браузером пользователя. (Шаг 4)
Еще одна важная деталь при корректном отображении текста это установка локали:
1 2
| // Кодировка UTF-8
setlocale(LC_ALL, 'Russian_Russia.65001'); |
При установки такой локали, пердставители других стран использующие
другую кодовую страницу в своей операционной системе, будут видеть
русский текст.
Мы рассмотрели основные моменты возникновения противоречий в
кодировках веб страницы, подведем итоги. Для того чтобы ваш рускоязычный
сайт был всегда доступен для чтения, необходимо прописать в PHP скрипте
настроек такие строки:
1 2 3 4 5 6 7 8
| <?php
// Вывод заголовка с данными о кодировке страницы
header('Content-Type: text/html; charset=utf-8');
// Настройка локали
setlocale(LC_ALL, 'ru_RU.65001', 'rus_RUS.65001', 'Russian_Russia. 65001', 'russian');
// Настройка подключения к базе данных
mysql_query('SET names "utf8"');
?> |
Если у тебя дорогой читатель остались вопросы по данной статье о PHP кодировке страниц, то смело задавай их в комментариях.
|