Выставляем кодировку UTF-8
На сколько бы это глупо не казалось, но для удачного выставления кодировки необходимо выполнить целых 11(!) правил.
Хочу зарание предупредить, если какая-то из настроек в .htaccess повлечет за собой ошибку 500, это значит, что хостинг запретил менять этот параметр на сервере. В таком случае проверьте тот факт, что у Вас UTF-8 и в случае чего обратитесь к админам хостинга.
И для тех, кто попал на эту страницу с вопросами об Ajax: Ajax работает в кодировке UTF-8.
Правило №1: Указываем в HTML верстке в теге первой строчкой, кроме случаев, где мы будем использовать тег , так как он так же как и кодировка имеет приоритет над расположением, следующий код:
Правило №2: Указываем кодировку для PHP и самого файла, для этого нам необходимо выставить заголовок функцией header(). Выставляем его в самом начале нашего файла (абсолютно в самом начале), сразу после указания уровня вывода ошибок:
Правило №3: Кодировка для подключения к к БД MySQL. Устанавливается после подключения к БД и выбора бд (mysql_connect, mysql_select_db). Если у нас модуль mysql:
Правило №4: Кодировка в .htaccess:
Правило №5: Кодировка для библиотеки mb, начиная с версии php 5.4 можно не указывать, так как по умолчанию будет использоваться именно UTF-8. Ну а пока прописываем её в файле .htaccess:
php_value mbstring.internal_encoding UTF-8
Правило №6: При сохранении файлов (обязательно ВСЕХ!) выбрать кодировку UTF-8 without BOM, повторюсь, without BOM — это необходимая настройка, в противном случае Ваш сайт не будет работать как надо. Для тех, кто пользуется удобной программой DreamWeaver:
Modify => Page Properties => Title/Encoding и выставляем «Encoding: UTF-8», после чего нажимаем ReLoad, убираем галочку с BOM «Include Unicode Signature (BOM)». Apply + OK.
Модификации => Свойства страницы => Заголовок/Кодировка и выставляем кодировку UTF-8. Нажимаем «перезагрузить», убрали галочку с Подключить Юникод Сигнатуры (BOM). Применить и OK.
Правило №7: если на данный момент какой-то из текстов был введён на странице или в БД — его необходимо перенабрать. Дело в том, что символ в одной кодировке представляет один набор бит для русских символов, а в другой — другой. Именно поэтому необходимо его либо перенабрать, либо перекодировать. Современные программы имеют возможность перевести текст из одной кодировки в другую. Об этой возможности интересуйтесь в мануалах Ваших программ.
Правило №8: Есть исключение, когда текст приходит к Вам на страницу с другого сайта в другой кодировке. Тогда на PHP есть удобная функция для перевода из одной кодировки в другую:
Правило №9: Для строковых функций strlen, substr, необходимо использовать их аналоги на библиотеке mb_, а именно: mb_strlen, mb_substr, то есть к функции дописываем mb_ .
Правило №10: Для работы с регулярными выражениями необходимо указывать модификатор u . Это обязательный параметр!
Правило №11: Для CSS файлов указывается кодировка так:
В заключение скажу, что символы в кодировке WIN-1251 состоят из 1 байта, то есть 8 бит, а в свою очередь в кодировке UTF-8 символы могут состоять от 1 до 4 байт, всё дело в том, что кодировка UTF-8 позволяет создавать мультиязычные сайты, так как все существующие в мире символы в ней присутствуют.
Ради любопытства русская буква в кодировке UTF-8 занимает 2 байта, именно поэтому за 1 символ функция strlen возвращает длину 2, то есть 2 байта, а mb_strlen возвращает уже правильную длину в 1 символ.
Школа программирования © 2012-2023
imbalance_hero | inpost@list.ru , admin@school-php.com
account on phpforum | youtube channel
Функция header
HTTP заголовки это специальная информация, которая присоединяется к документу, то есть, к тому файлу, который запрашивается браузером с сервера. Когда мы вбиваем в адресную строку какой-нибудь адрес то, соответственно, запрашиваем на сервере по этому адресу какой-нибудь документ. Эта информация(документ) видна у нас на экране. Но кроме видимой части есть еще и невидимая — те самые HTTP заголовки, которые отправляются сервером браузеру и они нужны для того, чтобы браузер корректно отобразил страницу. То есть, заголовки подсказывают браузеру как показать страницу или как отдать страницу.
Для браузера firefox: кнопка F12 -> сеть -> кликнуть «статус» и обновить страницу :
Среди прочего в заголовках отправляется информация о кодировке страницы, как давно модифицировалась страница, информация о том, что это за страница (html-страница, обычный текстовый документ; или, вместо того чтобы показать страницу, отдать ее на скачивание)
Установление кодировки
Один, из наиболее часто используемых вариантов функции header , это использование функции для установления кодировки.
В файле index.php в папке с нашим уроком запишем: привет, мир! и посмотрим в браузере, что получили. Мы можем получить крабозябры . Это происходит по тому, что браузер будет открывать документ в той кодировке, которую сервер отправил в заголовках по умолчанию. Если кодировка нашего документа не совпадает с кодировкой сервера — получим крабозябры.
Кодировка для всех частей нашего приложения должна быть единой .
Рекомендуется всегда использовать кодировку utf-8 — как универсальную кодировку.
Использование метатэга — не всегда помогает, потому что сервер может отправлять по умолчанию свою кодировку в заголовках и в этом случае она будет иметь больший приоритет, чем метатэг charset .
В этом случае мы должны переопределить кодировку сервера с помощью функции header . (php.net)
Функция header позволяет указать нужную нам кодировку.
header ( ‘Content-Type: text/html; charset=utf-8’ );
?>
где:
text/html — тип документа;
charset=utf-8 — нужная нам кодировка.
Если посмотрим заголовки в «разработка/инструменты разработчика/сеть» (в firefox ), то увидим, что они дополнились кодировкой charset=»UTF-8″ , то есть, мы указали браузеру (отправили заголовки), что нужно использовать именно данную кодировку. При этом она имеет приоритет над метатэгом charset .
Еще один способ установления кодировки по умолчанию — это использовать специальный файл .htaccess . Данный файл является файлом настройки сервера Apache .
Создадим даннный файл в нашей папке.
Установим кодировку для сервера по умолчанию с помощью специальной директивы AddDefaultCharset .
Данная директива заставляет сервер отправлять в заголовках кодировку, указанную в качестве значения данной дериктивы.
Организация редиректа
Функцию header часто используют для редиректа .
Создадим новый файл — inc.php и выведем в нем строку: «привет из подключаемого файла» .
echo ‘Привет из подключаемого файла’ ;
?>
В индексном файле используем функцию header для редиректа. Его можно сделать двумя командами:
— командой ‘ Location ‘
— командой ‘ refresh ‘
header ( ‘Content-Type: text/html; charset=utf-8’ );
header ( ‘Location: inc.php’ ); // где inc.php — относительный путь к файлу
?>
При работе с редиректом нужно помнить что редирект происходит не сразу. Когда отрабатывает
данная команда ( header(‘Location: inc.php’); ), выполнение файла продолжается дальше.
Чтобы сделать безусловный редирект и не выполнять дальнейший код нужно воспользоватся
одной из двух команд — функция die (пер.- умри) и функция exit (пер.- выйти).
Эти команды почти всегда рекомендуется использовать после редиректа.
Чтобы убедиться, что у нас код после команды редиректа выполняется, используем редирект
с задержкой: header(‘refresh: 5, url’) , где
5 — время задержки в секундах,
url=inc.php — адрес, на который должен быть перенаправлен пользователь (если внешний адрес,
то используем — http, если внутренний, то используем — относительный путь к файлу ).
Запускаем файл index.php:
header ( ‘Content-Type: text/html; charset=utf-8’ );
header( ‘Location: inc.php’ );
// — где inc.php — относительный путь к файлу
header ( ‘refresh: 5, url=inc.php’ );
// — адрес, на который должен быть перенаправлен пользователь
— после загрузки документа весь код у нас выполнился — выводится: привет мир!
После пятисекундной задержки нас перенаправляет на другой файл ( inc.php ) — выводится: привет из подключаемого файла .
Чтобы код не выполнялся используем любую из функций: либо exit , либо die .
header ( ‘Content-Type: text/html; charset=utf-8’ );
header( ‘Location: inc.php’ );
// — где inc.php — относительный путь к файлу
header ( ‘refresh: 5, url=inc.php’ );
exit ;
// die;
?>
— после загрузки документа код у нас не выполняется — видим пустую страницу.
После пятисекундной задержки перенаправляемся на другой файл — выводится: привет из подключаемого файла .
Проблемы вывода
Функция header отправляет заголовки в браузер. Они помогают коректно отобразить страницу. Эти заголовки должны бать отправленны раньше перед самим контентом страницы, поскольку браузер должен проанализировать заголовки и, в соответствии с ними, показать нашу страницу. Поэтому заголовки должны быть всегда отправленны до вывода , при этом заголовки могут отправлятся только один раз .
Если мы инициализируем вывод в браузер, то заголовки автоматически будут отправленны. Это значит, что если перед функцией header есть какой-то вывод в браузер, то она просто не отработает.
1. В этом легко убедиться, если в индексном файле поставим какой нибудь вывод, например, перенос строки перед функцией header :
— не удается изменить информацию заголовка — заголовки уже отправленны .
Выводом считается любой символ , который показывается в браузере, например, даже пробел.
2. С проблемой вывода можно столкнуться при подключении какого нибудь файла.
Например, мы подключаем файл inc.php, и в нем есть какая-то переменная — $test = ‘TEST’ .
В индексном файле мы хотим использовать данную переменную: $test ?> .