PHP

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

Здравствуйте, дорогие читатели.
Всё, что Вы хотели знать про использование 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);
Добавлено: 23 Августа 2013 01:35:34 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...