Кодировка UTF-8

Материал из AOW

Перейти к: навигация, поиск

При работе со строками в кодировке UTF-8 встречаются различные проблемы, например, такие как: в кодировке UTF-8 не работают strtoupper и strtolower для русских букв.. Как решить? Функция strlen не правильно считает длину строки Не работают регулярные выражения (preg_* функции)

И так далее

Хорошим тоном считается использовать кодировку UTF-8, несмотря на то, что большинство сайтов рунета до сих пор работают на Windows-1251. В статье я расскажу, что же именно нужно сделать, чтобы PHP сайт правильно заработал с Юникодом. Для указания кодировки в HTML служит тег meta. Но, несмотря на то, что с его помощью указана верная кодировка, все браузеры упорно считают, что документ пришел в Windows-1251. Дело в том, что сервер отправляет кодировку в заголовке ответа.

Content-type: text/html; charset=windows-1251

То есть сервер считает, что страница должна быть в кодировке Windows-1251, о чем говорит браузеру заголовком Content-type. Решить проблему можно двумя способами: Написать в начале скрипта (перед выводом HTML):

 <?php  header('Content-Type: text/html; charset=UTF-8'); ?>

Указать в файле .htaccess нужную кодировку:

AddDefaultCharset utf-8

Оба варианта приведут к желаемому результату - сервер вернет нужный нам заголовок:

Content-type: text/html; charset=utf-8

Метка BOM

Работая в кодировке UTF-8 нужно знать про злую метку BOM. Это такая последовательность байт, которая идет в начале файла и "помогает" понять, что это за кодировка. Однако для PHP эта метка оказывает медвежью услугу. Байты BOM просто выводятся вместе с документом, в результате чего возникают разные неприятные вещи. Например, IE отказывается реагировать на директиву DOCTYPE, в результате чего возможны неприятные сюрпризы с отображением HTML. Решение проблемы - использовать UTF-8 без BOM. Многие редакторы позволяют это делать, например, Notepad++:


Для работы в php с UTF-8  необходимо помнить некоторые правила:
В preg_* функциях надо использовать модификатор \u.

Вместо строковых функций (и функции mail() в часности) надо использовать их mb_* аналоги из библиотеки mbstring, или прописать в настройках PHP "mbstring.func_overload" для перегрузки стандартных функций. Тут вопрос: аналогов каких функций не существует в mbstring при работе с которыми в UTF-8 втречаются проблемы? Например, функции для сортировки строк (sort() и др.) я там не нашёл.

Не использовать оператор {n} ($str{0}), т.к. он не корректно работает с многобайтовыми кодировками

Личные инструменты

Разработка веб-сайтов, автоматизация.
По всем вопросам обращайтесь по телефонам:

+7 495 640 29 90
http://artofweb.ru