«Знание — могущество».

7 октября 2009

Работа со строками в кодировке UTF-8 в PHP 5

написал Figaroo в рубрике Web-разработка @ 23:53

Здравствуйте, дорогие читатели.
Всё, что Вы хотели знать про использование UTF-8 в PHP 5, но боялись спросить. :-)

Если верить определению, UTF-8 (от англ. Unicode Transformation Format — формат преобразования Юникода) — в настоящее время распространённая кодировка, реализующая представление Юникода, совместимое с 8-битным кодированием текста.

Если наше web-приложение работает в кодировке UTF-8, то оно будет доступно пользователю из любой страны, т.к. эта кодировка универсальна (в отличие от windows-1251 и прочих) и поддерживается всеми браузерами и платформами. Также, UTF-8 позволяет хранить символы практически всех известных алфавитов (разве что старославянскую письменность не корректно отображает иногда, но не будем об этом:-).

Но есть у неё один минус. Она не поддерживается по умолчанию в PHP 5 (в PHP 6 обещали исправить). Устраним этот недостаток.

Во-первых, работу с UTF-8 упрощают некоторые расширения для PHP — MB String и Iconv. Но мы не можем надеяться, что они будут установлены на сервере (ведь наш проект должен быть универсален).

Поэтому, мы должны использовать по возможности инструменты, предоставляемые нам расширениями, а в случае отсутствия последних — работать самостоятельно.

Определим, какому обработчику будем отдавать предпочтение — MB String (Multibyte String), Iconv или PHP (ручной режим). В MB String есть аналоги практически всех PHP-функций для работы со строками в кодировке UTF-8, в Iconv — ограниченный режим.

// назначаем обработчик строк - MB|Iconv|PHP - в зависимости от конфигурации сервера
define('STRING_HANDLER', function_exists("mb_strlen") ? 'MB' : (function_exists("iconv_strlen") ? 'Iconv' : 'PHP'));

Затем настроим обработчик строк на работу с UTF-8:

// устанавливаем настройки обработчика строк
switch (STRING_HANDLER) {
	case 'MB':
		mb_internal_encoding('UTF-8');
		mb_http_output('UTF-8');
	break;
	case 'Iconv':
		iconv_set_encoding('input_encoding', 'UTF-8');
		iconv_set_encoding('internal_encoding', 'UTF-8');
		iconv_set_encoding('output_encoding', 'UTF-8');
	break;
}

Все наши функции будут иметь префикс «f», чтобы не путаться.
Ниже я приведу код некоторых функций, а в конце поста — ссылку на скачивание готовой библиотеки.

Аналог htmlspecialchars:

function htmlsec ($str) {
	$str = (string)$str;
	return htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
}

Определение длины строки:

function fstrlen ($str) {
	$str = (string)$str;
	if (STRING_HANDLER == 'MB') return mb_strlen($str, 'utf-8');
	return strlen(utf8_decode($str));
}

Некоторые функции, такие как str_replace, explode/implode и др. корректно работают с юникодом UTF-8 и не нуждаются в переработке.

Немного о регулярных выражениях PCRE и UTF-8.
Для того, чтобы Ваши регулярные выражения работали с универсальной кодировкой UTF-8, нужно использовать модификатор «u». Пример:

preg_match("#[a-z0-9\\-.]@figaroo.ru#uis", $str);

Скачать архив с библиотекой функций: string.functions.rar.
Библиотека может в дальнейшем обновляться, я предупрежу.

Комментарии (2) »

  1. убэдыл, UTF-8 так UTF-8 :D

    Комментарий by KRECT — 8 октября 2009 @ 02:20


  2. =)

    Комментарий by Figaroo — 8 октября 2009 @ 07:31


RSS-лента комментариев к этой записи

Оставить комментарий

Пожалуйста, заполните все поля.

© Валерий 'Figaroo' Киркиж, 2008-2012 гг.