January 11th, 2010

Сложности с многобайтными кодировками в PHP

Справедливости ради, надо отметить, что обработка строк в многобайтовой кодировке может оказаться не простой задачей во многих языках программирования (например Oracle PL/SQL), а не только в PHP.

Типичным примером такой кодировки является utf-8 (utf8) , эта кодировка становится очень популярной в Web-программировании поэтому рассмотрим именно ее.

Многобайтная кодировка так называется, потому что один символ (буква) кодируется не одним байтом, а несколькими (в случае с utf8 -двумя).
Именно эта особенность и является корнем проблемы обработки строк.

Рассмотрим пример.
В кодировке utf8 у нас есть строка "Тестовая строка".
Мы хотим взять первые четыре символа(буквы) этой строки, для этого используем PHP-функцию substr.
Получаем такой код:



В результате получим:



Т.е. только два симвала (буквы). Это происходит, потому что PHP-функция substr работает не с симвалами и байтами, и она честно берет первые четыре байта строки, а поскольку в utf8 один символ - это два байта, вот и получается в результате две буквы вместо четырех.

Еще более интересные эффекты могут получиться, если пытаться выкусывать нечетное количество символов, тогда вместо последней буквы будет какой-нибудь непонятный символ.

Для работы с многобайтными кодировками, и utf8 в том числе, в PHP есть специальные функции, например в нашем случае корректный код будет таким:



В результате получаем:



Т.е. то, что надо.
Используются две функции, первая устанавливает кодировку, вторая выполняет преобразование.

PHP предлагает целую группу функций для работы с многобайтными кодировками, большинство из них легко узнать по приставке mb_.

Петрелевич Сергей
petrelevich@yandex.ru
www.SmartyIT.ru