Простые правила работы с UTF-8 кодировкой в PHP

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

Я думаю, не надо рассказывать, что UTF-8 уже является стандартом для большинства web-приложений и пока не планируется особых замен. Но на текущий момент множество начинающих "познавателей" PHP сталкиваются с проблемами в этом месте и постят кучу топиков в связи с тем, что PHP пока не поддерживает кодировку UTF-8 "из коробки" и приносит вышеуказанным людям кучу непонимания и проблем. Кракозяблики, кракозяблики, кракозяблики... Проблема с UTF-8... Что делать? Помогите - слышно тут и там... На самом деле всё очень просто. Ниже я опишу несколько правил, которые позволяют избавиться от "проблем" с UTF-8 при разработке приложений на PHP.

Для начала, когда, пользуясь здравым смыслом, мы решаем работать с UTF-8 для простоты дела мы утверждаем, что от ныне абсолютно всё у нас будет храниться, писаться, выводиться в UTF-8. Второе, что нам будет нужно, это наличие php_mbstring расширения на сервере, которое предоставляет функции для работы со строками в многобайтном режиме. Для тех, кто в танке это функции, которые начинаются на mb_. Если ваш хостинг провайдер не потрудился установить у себя это расширение - смело выбирайте другого. Итак, если если ваш php поддерживает mb_ функции - пол дела сделано. Остальные пол дела для работы с UTF-8 в PHP заключаются в следующем:

1. В начале работы скрипта необходимо указать кодировку входа и выхода с помощью функции mb_internal_encoding:

Listing №1 (PHP)
mb_internal_encoding('UTF-8');

Также это позволит определить кодировку по умолчанию для всех mb-функций, которым нужно её указывать.

2. При работе со строками, преобразованиями символов, необходимо использовать функции работы со строками из расширения php_mbstring. Это, например, такие как mb_substr, mb_strpos, mb_strlen и т.п. или же те функции, которые безопасны для обработки данных в двоичной форме, такие как explode, str_replace и т.д. Эта особенность указана в мануале по этим функциям. Иногда нельзя просто заменить функцию на её mb-аналог, потому как такой там просто нет. Например, ucfirst, которая преобразует первый символ строки в верхний регистр. Решение тут очень простое - изящной комбинацией mb_substr и mb_strtoupper получаем необходимый результат. Попробуйте проделать это сами )). Также в этот пункт стоит отнести такие функции как htmlspecialchars, htmlentities и т.п., которые производят различные преобразования строк. Пожалуйста, передавайте в них третий аргумент $charset в виде строки 'UTF-8'.

3. Так как мы используем строки символов в самих скриптах, то строго необходимо сохранять их в UTF-8 кодировке. Это также относиться ко всем остальным файлам, которые вы используете - HTML шаблоны, различные подключаемые файлы, текстовые и т.д. Это всё должен делать ваш редактор кода. Согласуйте с ним эти вещи. Но смотрите внимательно, что бы он кодировал или преобразовывал файлы в UTF-8 без особой метки, называемой BOM. Так будет намного лучше.

4. Немаловажным фактором, является работа браузера с кодировкой UTF-8, а точнее с данными, которые вы посылаете ему, и теми данными, которые он отсылает вам. Для того, что бы браузер правильно понимал в какой кодировке вы отправили ему данные нужно отсылать заголовок с указанием кодировки. Это можно сделать так:

Listing №2 (PHP)
header('Content-Type: text/html; charset=UTF-8');

Только не забудьте отправлять этот заголовок до какого либо вывода с помощью echo, print или просто пробелов в начале скрипта до тега <?php или где то между парой этих тегов ?> <?php. Ну, а для того, чтобы браузер отсылал вам данные в нужной кодировке, нужно помечать сам html документ соответствующим мета-тегом. Например таким:

Listing №3 (HTML)
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

5. Наверное больше всего трудностей вызывает работа с базой данных. Обычно используется MySQL СУРБД. Тут всё тоже очень просто. Перед тем как послать и принимать данные нужно сказать серверу базы данных, что вы будете отсылать ей данные в кодировке UTF-8. Не вдаваясь в особые подробности, скажу лишь, что перед любым обращением к базе лишь единожды, т.е. один раз, нужно выполнить два запроса. Вот они:

Listing №4 (SQL)
SET NAMES "utf8"
-- и
SET CHARACTER SET "utf8"

Поверьте, она с радостью воспримет ваш призыв. Но не только обмениваться, а и хранить данные нужно соответственно. Посему изначально создавайте поля, хранящие строки в UTF-8 кодировке. Я думаю, вам не составит труда указать это при создании таблицы ;)


Ну вот и всё. Придерживаясь этих правил, и, я думаю, вы больше не будете встречать каких-то проблем с UTF-8 в PHP, по крайней мере до выхода шестой его версии. Хотя я знаю некоторые ситуации, но эта заметка не про них.
Теги:
кодировки, UTF-8, utf8, php_mbstring extension, mb_substr, проблемы с UTF-8, charset
Добавлено: 08 Августа 2018 07:58:54 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...