Зарегистрирован: 01.06.2005
Сообщ.: 488 Карма: 142 поощрить/наказать
Откуда: Москва
Добавлено: Вс Авг 14, 2005 10:11 pm (написано за 1 час 22 минуты 15 секунд)
Заголовок сообщения: UTF8: PHP класс для обработки текста в кодировке UTF-8
A package of PHP functions to manipulate strings encoded in UTF-8. The powerful solution/contribution for UTF-8 support in your CMF/CMS, written on PHP. This package IMHO better then PHP UTF-8, http://sourceforge.net/projects/phputf8.
Поддержка UTF-8 в PHP 5. Набор (сборник, библиотека, склад, репозиторий) PHP функций для разработчиков веб-сайтов, использующих кодировку UTF-8
Преимущества использования этого класса:
почти все функции могут работать без расширения ICONV и MBSTRING (если они есть, то активно используются)
унифицированный интерфейс
полезные функции, отсутствующие в ICONV и MBSTRING
/** * Remove combining diactrical marks, with possibility of the restore * Удаляет диакритические знаки в тексте, с возможностью восстановления (опция) * * @param string|null $s * @param array|null $additional_chars for example: "\xc2\xad" #soft hyphen = discretionary hyphen * @param bool $is_can_restored * @param array|null $restore_table * @return string|null|bool returns FALSE if error occured */ public staticfunction diactrical_remove($s, $additional_chars = null, $is_can_restored = false, &$restore_table = null);
/** * Restore combining diactrical marks, removed by self::diactrical_remove() * Восстанавливает диакритические знаки в тексте, при условии, что их символьные позиции и кол-во символов не изменились! * * @see self::diactrical_remove() * @param string|null $s * @param array $restore_table * @return string|null|bool returns FALSE if error occured (broken $restore_table) */ public staticfunction diactrical_restore($s, $restore_table);
/** * Функция для перекодировки данных произвольной структуры из какой-либо кодировки в кодировку UTF-8. * * @param array|scalar|null $data * @param string $charset * @return array|scalar|null returns FALSE if error occured */ public staticfunction convert_from($data, $charset = 'cp1251');
/** * Функция для перекодировки данных произвольной структуры из кодировки UTF-8 в другую кодировку. * * @param array|scalar|null $data * @param string $charset * @return array|scalar|null returns FALSE if error occured */ public staticfunction convert_to($data, $charset = 'cp1251');
/** * Strips out device control codes in the ASCII range. * * @param string|null string to clean * @return string|null|bool returns FALSE if error occured */ public staticfunction strict($s);
/** * Проверка данных на принадлежность классу символов ASCII * Для значений null, integer, float, boolean возвращает TRUE. * * Массивы обходятся рекурсивно, если в хотябы одном элементе массива * его значение не ASCII, возвращается FALSE. * * @param array|scalar|null $data * @return bool */ public staticfunction is_ascii($data);
/** * Returns true if data is valid UTF-8 and false otherwise. * Для значений null, integer, float, boolean возвращает TRUE. * * Массивы обходятся рекурсивно, если в хотябы одном элементе массива * его значение не в кодировке UTF-8, возвращается FALSE. * * @link http://www.w3.org/International/questions/qa-forms-utf-8.html * @link http://ru3.php.net/mb_detect_encoding * @link http://webtest.philigon.ru/articles/utf8/ * @link http://unicode.coeurlumiere.com/ * @param array|scalar|null $data * @param bool $is_strict строгая проверка диапазона ASCII? * @return bool */ public staticfunction is_utf8($data, $is_strict = true);
/** * Check the data in UTF-8 charset on given ranges of the standard UNICODE. * The suitable alternative to regular expressions. * * Для значений null, integer, float, boolean возвращает TRUE. * * Массивы обходятся рекурсивно, если в хотябы одном элементе массива * его значение не прошло проверку, возвращается FALSE. * * Examples: * #A simple check the standard named ranges: * UTF8::blocks_check('поисковые системы Google и Yandex', array('Basic Latin', 'Cyrillic')); * #You can check the named, direct ranges or codepoints together: * UTF8::blocks_check('поисковые системы Google и Yandex', array(array(0x20, 0x7E), #[\x20-\x7E] * array(0x0410, 0x044F), #[A-Яa-я] * 0x0401, #russian yo (Ё) * 0x0451, #russian ye (ё) * 'Arrows', * )); * * @link http://www.unicode.org/charts/ * @param array|scalar|null $data * @param array $blocks * @return bool Возвращает TRUE, если все символы из текста принадлежат указанным диапазонам * и FALSE в противном случае или для разбитого UTF-8. */ public staticfunction blocks_check($data, $blocks);
/** * Перекодирует значения элементов массивов $_GET, $_POST, $_COOKIE, $_REQUEST, $_FILES из кодировки $charset в UTF-8, если необходимо. * Побочным положительным эффектом является защита от XSS атаки с непечатаемыми символами на уязвимые PHP функции. * Т.о. веб-формы можно посылать на сервер в 2-х кодировках: $charset и UTF-8. * Параметры для тестирования: ?тест[тест]=тест (можно просто дописать в адресную строку браузера IE >= 5.x) * * Алгоритм работы: * 1) Функция проверяет массивы $_GET, $_POST, $_COOKIE, $_REQUEST, $_FILES * на корректность значений элементов кодировке UTF-8. * 2) Значения не в UTF-8 принимаются как $charset и конвертируется в UTF-8, * при этом байты от 0x00 до 0x7F (ASCII) сохраняются как есть. * 3) Сконвертированные значения снова проверяются. * Если данные опять не в кодировке UTF-8, то они считаются разбитыми и функция возвращает FALSE. * * ЗАМЕЧАНИЕ * Функция должна вызываться после self::unescape_request()! * * @see self::unescape_request() * @param bool $is_hex2bin Декодировать HEX-данные? * Пример: 0xd09ec2a0d0bad0bed0bcd0bfd0b0d0bdd0b8d0b8 => О компании * Параметры в URL адресах иногда бывает удобно кодировать не функцией rawurlencode(), * а использовать следующий механизм (к тому же кодирующий данные более компактно): * '0x' . bin2hex($string) * @param string $charset * @return bool Возвращает TRUE, если все значения элементов массивов в кодировке UTF-8 * и FALSE + E_USER_WARNING в противном случае. */ public staticfunction autoconvert_request($is_hex2bin = false, $charset = 'cp1251');
/** * Implementation strcasecmp() function for UTF-8 encoding string. * * @param string|null $s1 * @param string|null $s2 * @return int|bool|null Returns FALSE if error occured * Returns < 0 if $s1 is less than $s2; * > 0 if $s1 is greater than $s2; * 0 if they are equal. */ public staticfunction casecmp($s1, $s2);
/** * Converts a UTF-8 character to a UNICODE codepoint * * @param string|null $char UTF-8 character * @return int|bool|null Unicode codepoint * Returns FALSE if $char broken (not UTF-8) */ public staticfunctionord($char); # = UTF8::to_unicode() or unicode_from_utf8()
/** * Converts a UNICODE codepoint to a UTF-8 character * * @param int|digit|null $cp Unicode codepoint * @return string|null UTF-8 character */ public staticfunctionchr($cp); # = from_unicode() or unicode_to_utf8()
/** * Implementation chunk_split() function for UTF-8 encoding string. * * @param string|null $s * @param int|digit $length * @param string $glue * @return string|bool|null returns FALSE if error occured */ public staticfunctionchunk_split($s, $length = null, $glue = null);
/** * Конвертирует регистр букв в строке в кодировке UTF-8 * * @link http://www.unicode.org/charts/PDF/U0400.pdf * @link http://ru.wikipedia.org/wiki/ISO_639-1 * @param scalar|null $s строка * @param int $mode {CASE_LOWER|CASE_UPPER} * @return scalar|null returns FALSE if error occured */ public staticfunction convert_case($s, $mode);
/** * @param scalar|null $s * @return scalar|null returns FALSE if error occured */ public staticfunction lowercase($s);
/** * @param scalar|null $s * @return scalar|null returns FALSE if error occured */ public staticfunction uppercase($s);
/** * Convert all HTML entities to native UTF-8 characters * Функция декодирует гораздо больше именованных сущностей, чем стандартная html_entity_decode() * Все dec и hex сущности так же переводятся в UTF-8. * * Example: '"' or '"' or '"' will be converted to '"'. * * @link http://www.htmlhelp.com/reference/html40/entities/ * @link http://www.alanwood.net/demos/ent4_frame.html (HTML 4.01 Character Entity References) * @link http://msdn.microsoft.com/workshop/author/dhtml/reference/charsets/charset1.asp?frame=true * @link http://msdn.microsoft.com/workshop/author/dhtml/reference/charsets/charset2.asp?frame=true * @link http://msdn.microsoft.com/workshop/author/dhtml/reference/charsets/charset3.asp?frame=true * @param scalar|null $s * @param bool $is_htmlspecialchars обрабатывать специальные html сущности? (< > & ") * @return scalar|null returns FALSE if error occured */ public staticfunctionhtml_entity_decode($s, $is_htmlspecialchars = false);
/** * Convert special UTF-8 characters to HTML entities. * Функция кодирует гораздо больше именованнvх сущностей, чем стандартная htmlentities() * * @link http://www.htmlhelp.com/reference/html40/entities/ * @link http://www.alanwood.net/demos/ent4_frame.html (HTML 4.01 Character Entity References) * @link http://msdn.microsoft.com/workshop/author/dhtml/reference/charsets/charset1.asp?frame=true * @link http://msdn.microsoft.com/workshop/author/dhtml/reference/charsets/charset2.asp?frame=true * @link http://msdn.microsoft.com/workshop/author/dhtml/reference/charsets/charset3.asp?frame=true * @param scalar|null $s * @return scalar|null returns FALSE if error occured */ public staticfunction html_entity_encode($s);
/** * Call preg_match_all() and convert byte offsets into character offsets for PREG_OFFSET_CAPTURE flag. * This is regardless of whether you use /u modifier. * * @param string $pattern * @param string|null $subject * @param array $matches * @param int $flags * @param int $char_offset * @return array|null|bool returns FALSE if error occured */ public staticfunctionpreg_match_all($pattern, $subject, &$matches, $flags = PREG_PATTERN_ORDER, $char_offset = 0);
/** * Обрезает текст в кодировке UTF-8 до заданной длины, * причём последнее слово показывается целиком, а не обрывается на середине. * Html сущности корректно обрабатываются. * * @param string|null $s текст в кодировке UTF-8 * @param int|null|digit $maxlength ограничение длины текста * @param string $continue завершающая строка, которая будет вставлена после текста, если он обрежется * @param bool|null &$is_cutted текст был обрезан? * @param int|digit $tail_min_length если длина "хвоста", оставшегося после обрезки текста, меньше $tail_min_length, * то текст возвращается без изменений * @return string|null|bool returns FALSE if error occured */ public staticfunction str_limit($s, $maxlength = null, $continue = "\xe2\x80\xa6", &$is_cutted = null, $tail_min_length = 20); #"\xe2\x80\xa6" = "…"
/** * Implementation str_split() function for UTF-8 encoding string. * * @param string|null $s * @param int|null|digit $length * @return array|null|bool returns FALSE if error occured */ public staticfunction str_split($s, $length = null);
/** * Implementation strlen() function for UTF-8 encoding string. * * @param string|null $s * @return int|null|bool returns FALSE if error occured */ public staticfunctionstrlen($s);
/** * Implementation strpos() function for UTF-8 encoding string * * @param string|null $s The entire string * @param string|int $needle The searched substring * @param int|null $offset The optional offset parameter specifies the position from which the search should be performed * @return int|null|bool Returns the numeric position of the first occurrence of needle in haystack. * If needle is not found, self::strpos() will return FALSE. */ public staticfunctionstrpos($s, $needle, $offset = null);
/** * Implementation strrev() function for UTF-8 encoding string * * @param string|null $s * @return string|null|bool returns FALSE if error occured */ public staticfunctionstrrev($s);
/** * Implementation substr() function for UTF-8 encoding string. * * @link http://www.w3.org/International/questions/qa-forms-utf-8.html * @param string|null $s * @param int|digit $offset * @param int|null|digit $length * @param bool $in_cycle speed improve for calling this method in cycles with the same $str and different $offset/$length! * @return string|null|bool returns FALSE if error occured */ public staticfunctionsubstr($s, $offset, $length = null, $in_cycle = false);
/** * Implementation ucfirst() function for UTF-8 encoding string. * Преобразует первый символ строки в кодировке UTF-8 в верхний регистр. * * @param string|null $s * @param bool $is_other_to_lowercase остальные символы преобразуются в нижний регистр? * @return string|null|bool returns FALSE if error occured */ public staticfunctionucfirst($s, $is_other_to_lowercase = true);
/** * Implementation ucwords() function for UTF-8 encoding string. * Преобразует в верхний регистр первый символ каждого слова в строке в кодировке UTF-8, * остальные символы каждого слова преобразуются в нижний регистр. * Эта функция считает словами последовательности символов, разделенных пробелом, переводом строки, возвратом каретки, горизонтальной табуляцией, неразрывным пробелом. * * @param string|null $s * @param bool $is_other_to_lowercase остальные символы преобразуются в нижний регистр? * @return string|null|bool returns FALSE if error occured */ public staticfunctionucwords($s, $is_other_to_lowercase = true);
/** * Функция декодирует строку в формате %uXXXX или %u{XXXXXX} в строку формата UTF-8. * * Функция используется для декодирования данных типа "%u0442%u0435%u0441%u0442", * закодированных устаревшей функцией javascript://encode(). * Рекомендуется использовать функцию javascript://encodeURIComponent(). * * ЗАМЕЧАНИЕ * Устаревший формат %uXXXX позволяет использовать юникод только из диапазона UCS-2, т.е. от U+0 до U+FFFF * * @param scalar|null|array $data * @param bool $is_rawurlencode * @return scalar|null|array returns FALSE if error occured */ public staticfunction unescape($data, $is_rawurlencode = false);
/** * 1) Корректирует глобальные массивы $_GET, $_POST, $_COOKIE, $_REQUEST * декодируя значения в юникоде "%uXXXX" и %u{XXXXXX}, закодированные, например, через устаревшую функцию javascript escape() * Cтандартный PHP 5.2.x этого делать не умеет. * 2) Если в HTTP_COOKIE есть параметры с одинаковым именем, то берётся последнее значение, * а не первое (так обрабатывается QUERY_STRING). * 3) Создаёт массив $_POST для нестандартных Content-Type, например, "Content-Type: application/octet-stream". * Стандартный PHP 5.2.x создаёт массив только для "Content-Type: application/x-www-form-urlencoded" и "Content-Type: multipart/form-data". * * @return void */ public staticfunction unescape_request();
/** * Вычисляет высоту области редактирования текста (<textarea>) по значению и ширине. * * В большинстве случаев будет корректно работать для моноширинных шрифтов. * Т.к. браузер переносит последнее слово, которое не умещается на строке, * на следующую строку, высота м.б. меньше ожидаемой. * Этот алгоритм явл. простым (и быстрым) и не отслеживает переносы слов. * * @param string|null $s текст * @param int|digit $cols ширина области редактирования (колонок) * @param int|digit $min_rows минимальное кол-во строк * @param int|digit $max_rows максимальное кол-во строк * @return int|null|bool */ public staticfunction textarea_rows($s, $cols, $min_rows = 3, $max_rows = 32);
Зарегистрирован: 01.06.2005
Сообщ.: 488 Карма: 142 поощрить/наказать
Откуда: Москва
Добавлено: Пн Ноя 12, 2007 12:01 pm (спустя 20 дней 18 часов 50 минут; написано за 2 минуты 45 секунд)
Заголовок сообщения:
Обновление от 2007-11-12.
html_template() -- Если имя метки-заменителя начинается с _SERVER или _REQUEST, то применяется htmlspecialchars($string); добавлены методы .intval() и .floatval()
utf8_str_limit() -- Если текст содержит HTML код, теперь он НЕ вырезается автоматически
Зарегистрирован: 01.06.2005
Сообщ.: 488 Карма: 142 поощрить/наказать
Откуда: Москва
Добавлено: Пн Ноя 19, 2007 10:17 am (спустя 3 часа 26 минут; написано за 1 минуту 4 секунды)
Заголовок сообщения:
Обновление от 2007-11-19.
utf8_autoconvert_request_charset() -- добавлена перекодировка массива $_FILES. Кстати, побочным положительным эффектом функции является защита от XSS атаки с непечатаемыми символами на уязвимые PHP функции.
php2js() символ квотирования по умолчанию -- двойная кавычка вместо одинарной (стандарт JSON)
strip_tags_smart() Пробелы и переносы строк форматируется по-умолчанию. Чтобы исключить форматирование, необходимо установить параметр $is_format_spaces = FALSE.
ucs2_to_utf8() Новая функция. Преобразует строку из кодировки UCS-2 в UTF-8, без использования iconv (основной PHP-код -- Юрий Насретдинов)
utf8_unescape() Функция может работать без использования библиотеки iconv.
Добавлено: Ср Июн 11, 2008 4:18 pm (спустя 5 дней 22 часа 26 минут; написано за 3 минуты 18 секунд)
Заголовок сообщения: Косяк
Жесть вообще! Архив про UTF-8, а все комментарии на русском языке в кодировке cp1251! Да и RAR-архиватор для Open Source-подборки - нонсенс! Мне очень понравилась подборка сама по себе, авторы молодцы и очень постарались, но в GNU/Linux мне трудно с ней работать, потому как в редакторе по умолчанию стоит юникод, а добиваться поддержки rar-архивов пришлось скачиванием дополнительного софта.
Взываю к вам! Используйте юникод в комментариях и открытые архиваторы(zip,gz,bz2,7z).
Добавлено: Ср Июн 18, 2008 5:03 pm (спустя 5 часов 12 минут)
Заголовок сообщения: еще два варианта utf8_substr
/** * Функция для быстрого примерного(!) отрезания строки в кодировке utf-8 * только для 2хбайтной кодировки, но после небольшой доработки будет работать и с 3-4хбайтной * * substr работает только с однобайтными кодировками, поэтому * - неправильно отрезает utf8-строку (в байтах, а не символах) * учитывая, что русские символы занимают 2 байта, латинские, пробел, вводимые с клавиатуры спецсимволы - 1 байт, * то опытным путем подбирается примерный коэффициент 1.8 * - последний символ может случайно отрезаться частично. Поэтому проверяем, если его код 11xxxxxx (0xC0) - отрезаем его тоже. * * Зато работает значительно быстрее любой другой функции отрезания utf-8, даже встроенных! * Примерный результат теста на shared-хостинге с PHP5 при $length = 1000 и длине входного текста (статья на русском языке) = 5000 символов: * utf8_fast_approx_substr (эта функция) - 0.000018 секунды (+ 0.000020 секунды собственно на вызов этой функции) * mb_substr (только при установленном пакете MultiByte) - 0.000048 секунды * utf8_fast_substr - 0.000126 секунды (+ 0.000020 секунды собственно на вызов этой функции) * utf8_substr - 0.011364 секунды (+ 0.000020 секунды собственно на вызов этой функции) * iconv_substr (только при установленном пакете Iconv) - 0.057839 секунды * * @param string $string входная строка в кодировке utf-8 * @param int $start начальное смещение * Если start неотрицателен, возвращаемая подстрока начинается с позиции start от начала строки, считая от нуля. * Например, в строке 'abcdef', в позиции 0 находится символ 'a', в позиции 1 - символ 'b', и т.д. * Если start отрицательный, возвращаемая подстрока начинается с start символа с конца строки string. * Например, в строке 'abcdef', в позиции -1 находится символ 'f', в позиции -2 - символ 'e', и т.д. * Если длина строки string меньше или равна start символов, возвращается FALSE. * @param int $length длина * Если length положительный, то от start будет отсчитано примерно length символов, а последующие отрезаны. * Если length отрицательный, то будет отброшено примерно length символов с конца строки string. * Если при этом позиция начала подстроки, определяемая аргументом start, находится в отброшенной части строки, возвращается пустая строка. * * @return string/boolean * * @author Boris Korobkov * @link http://www.ajaxforum.ru/ */ function utf8_fast_approx_substr($string, $start, $length = null) { if (function_exists('mb_substr')) { /* только при установленном пакете MultiByte. mb_substr хоть и медленней этой функции, но зато точнее */ return mb_substr($string, $offset, $length, 'utf-8'); }
/* если последний байт = полсимвола utf-8, удалить его */ if (ord(substr($string, -1)) & 0xC0) { $string = substr($string, 0, -1); } return $string;
}
/** * Функция для быстрого отрезания конца строки в кодировке utf-8 * * Примерный результат теста на shared-хостинге с PHP5 при $length = 1000 и длине входного текста (статья на русском языке) = 5000 символов: * utf8_fast_approx_substr - 0.000018 секунды (+ 0.000020 секунды собственно на вызов этой функции) * mb_substr (только при установленном пакете MultiByte) - 0.000048 секунды * utf8_fast_substr (эта функция) - 0.000126 секунды (+ 0.000020 секунды собственно на вызов этой функции) * utf8_substr - 0.011364 секунды (+ 0.000020 секунды собственно на вызов этой функции) * iconv_substr (только при установленном пакете Iconv) - 0.057839 секунды * * * @param string $string входная строка в кодировке utf-8 * @param int $length длина (положительная) * * @return string * * @author Boris Korobkov * @link http://www.ajaxforum.ru/ */ function utf8_fast_substr($string, $length) { if (function_exists('mb_substr')) { /* только при установленном пакете MultiByte. mb_substr быстрее этой функции */ return mb_substr($string, 0, $length, 'utf-8'); }
Зарегистрирован: 01.06.2005
Сообщ.: 488 Карма: 142 поощрить/наказать
Откуда: Москва
Добавлено: Чт Июн 19, 2008 1:53 pm (спустя 20 часов 49 минут; написано за 2 минуты 57 секунд)
Заголовок сообщения:
БориК
Насколько я помню, в библиотеке PCRE было ограничение на кол-во повторов в 65535 символов. Попробуйте отрезать рег. выражением первые 70,000 символов: /^.{70000}/su
Ваша функция не совместима по параметрам с substr() и utf8_substr() из архива.
Зарегистрирован: 01.06.2005
Сообщ.: 488 Карма: 142 поощрить/наказать
Откуда: Москва
Добавлено: Пн Ноя 17, 2008 12:13 pm (спустя 1 месяц 3 дня 23 часа 27 минут; написано за 34 секунды)
Заголовок сообщения:
Обновление от 2008-11-17
strip_tags_smart() -- текст форматируется только в том случае, если были вырезаны какие-либо таги.
utf8_unescape_request() -- если в HTTP_COOKIE есть параметры с одинаковым именем, то берётся последнее значение, а не первое (так обрабатывается QUERY_STRING).
utf8_simple_search_sql -- улучшен поиск целых слов (см. $re_utf8_no_letter_begin), функция может возвращать массив
Зарегистрирован: 01.06.2005
Сообщ.: 488 Карма: 142 поощрить/наказать
Откуда: Москва
Добавлено: Ср Dec 17, 2008 12:11 pm (спустя 10 часов 20 минут; написано за 1 минуту 36 секунд)
Заголовок сообщения:
Обновление от 2008-12-17
normal/ -- добавлены скрипты для нормализации UTF-8 из mediawiki.org
class Func -- метод Func::setPath() заменён на метод Func::add_include_path()
utf8_preg_match_all() -- Новая функция
utf8_str_split() -- Новая функция
utf8_chunk_split() -- Новая функция
php2js() -- Некоторые улучшения в коде
utf8_unescape_request() -- Создаёт массив $_POST для нестандартных Content-Type, например, "Content-Type: application/octet-stream". Стандартный PHP 5.2.x создаёт массив только для "Content-Type: application/x-www-form-urlencoded" и "Content-Type: multipart/form-data".
Добавлено: Чт Фев 05, 2009 3:18 am (спустя 1 месяц 5 дней 15 часов 15 минут; написано за 56 секунд)
Заголовок сообщения: спасибо + вопрос по ucs2 и utf16
Господа, можно вопрос, почему процедуру конверта из ucs2 заменили utf-16. это одно и то же ?
Вы не можете начинать темы. Вы не можете отвечать на сообщения. Вы не можете редактировать свои сообщения. Вы не можете удалять свои сообщения. Вы не можете голосовать в опросах. Вы не можете прилагать файлы к сообщениям. Вы можете скачивать файлы.