Здравствуйте, дорогие читатели.
Всё, что Вы хотели знать про использование 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.
Библиотека может в дальнейшем обновляться, я предупрежу.
убэдыл, UTF-8 так UTF-8 :D
Комментарий by KRECT — 8 октября 2009 @ 02:20
=)
Комментарий by Figaroo — 8 октября 2009 @ 07:31