В языке программирования существует понятие символа. Каждый символ состоит из определенного количества байтов, которое в точности его описывает. В большинства языков все необходимые символы можно закодировать одним восьмибитным значением, но существуют также и языки, требующие столько символов, что они не умещаются в один байт.
Многобайтные строки, для которых используют специально разработанные схемы кодирования, могут содержать более, чем 256 символов. При этом функции для их обработки продолжают работать со строками, как будто они закодированы в обычной побайтовой системе.
Большинство функций PHP не умеют работать с многобайтными строками. При этом они будут возвращать совсем неправильный результат. Для правильной обработки данных строк, необходимо использовать специальные функции, так как в таких кодировках два или более последовательных байта могут задавать один символ.Модуль Mbstring предоставляет функции для работы с многобайтными строками и занимается конвертированием строк из одной кодировки в другую. Также предназначен для работы с Unicode-кодировками, такими, как UTF-8 и UCS-2.
Модуль Mbstring не входит в список расширений, устанавливаемых по умолчанию. Для включения достаточно добавить в файле Php.ini следующую строку:
extension=php_mbstring.dll
Большинство стандартных функций имеют аналоги для работы с многобайтными строками и отличаются только префиксом «mb_» и некоторыми параметрами кодировки.
Также необходимо четко задавать Mb_internal_encoding, которая устанавливает внутреннюю кодировку скрипта. В качестве параметра указывается кодировка, в которую будут преобразовываться входные данные HTTP запроса, из которой будет конвертироваться HTTP вывод, а также это кодировка по умолчанию для всех функций работающих со строками, определенными в модуле Mbstring:
mb_internal_encoding( 'UTF-8' );
Например, для функции Strlen аналогом служит функция Mb_strlen. Точно также и для других функций.
Приведем пример, который покажет различие в данных функциях:
echo strlen( 'Вася Пупкин' ); // 21 echo mb_strlen( 'Вася Пупкин' ); // 11
Как видно из примера, функция Mb_strlen покажет правильное значение.
Будьте внимательны с кодировками, поскольку данные ошибки очень сложно найти. Поэтому, рекомендуется всегда жестко указывать необходимую кодировку и использовать подходящие функции.