Предлагаю Вашему вниманию мою статью о работе с многобайтными кодировками
Сложности с многобайтными кодировками в PHP
v:1.0 11.01.2010
Справедливости ради, надо отметить, что обработка строк в многобайтовой кодировке может оказаться не простой задачей во многих языках
программирования (например Oracle PL/SQL), а не только в PHP.
Типичным примером такой кодировки является utf-8 (utf8) , эта кодировка становится очень популярной в Web-программировании поэтому рассмотрим именно ее.
Многобайтная кодировка так называется, потому что один символ (буква) кодируется не одним байтом, а несколькими (в случае с utf8 -двумя).
Именно эта особенность и является корнем проблемы обработки строк.
Рассмотрим пример.
В кодировке utf8 у нас есть строка "Тестовая строка".
Мы хотим взять первые четыре символа(буквы) этой строки, для этого используем PHP-функцию substr.
Получаем такой код:
В результате получим:
Т.е. только два симвала (буквы). Это происходит, потому что PHP-функция substr работает не с симвалами и байтами, и она честно берет первые четыре байта
строки, а поскольку в utf8 один символ - это два байта, вот и получается в результате две буквы вместо четырех.
Еще более интересные эффекты могут получиться, если пытаться выкусывать нечетное количество символов, тогда вместо последней буквы будет какой-нибудь
непонятный символ.
Для работы с многобайтными кодировками, и utf8 в том числе, в PHP есть специальные функции, например в нашем случае корректный код будет таким:
В результате получаем:
Т.е. то, что надо.
Используются две функции, первая устанавливает кодировку, вторая выполняет преобразование.
PHP предлагает целую группу функций для работы с многобайтными кодировками, большинство из них легко узнать по приставке mb_.