utf8 - проверка на валидность

young

Новичок
utf8 - проверка на валидность

дана строка

проверить является ли она валидной строкой текста в кодировке UTF-8
есть идеи? :)
 

slach

Новичок
SiMM судя по всему ты вопроса не понял
тебе говорят про ВАЛИДНОСТЬ самой строки а не BOM идентификаторе в начале строки

young - вот тут есть вполне себе приятные примеры в комментариях http://php.net/manual/en/function.mb-detect-encoding.php
 

SiMM

Новичок
> тебе говорят про ВАЛИДНОСТЬ самой строки а не BOM идентификаторе в начале строки
Господи, а BOM-то тут при чём? Вы правила создания UTF-8 строки из Unicode смотрели? И что же, регулярник составить по ним сложно для валидации? Я думаю young уже давно справился с этой несложной задачей.

-~{}~ 03.05.06 10:18:

Собственно, в комментариях одного из примеров даже ссылка на ЭТОТ (но англоязычный) источник информации указывается :)
 

Rin

*
PHP:
<?php

/**
 * Returns true if $data is valid UTF-8 and false otherwise.
 * Массивы обходятся рекурсивно, если в хотябы одном элементе массива его значение
 * не явл. строкой в кодировке utf-8, возвращается false.
 *
 * @param    mixed(array/string)  $data  arrays parsed recursive
 * @return   bool
 *
 * @charset  ANSI
 * @link     http://www.w3.org/International/questions/qa-forms-utf-8.html
 * @link     http://ru3.php.net/mb_detect_encoding
 * @version  1.1.3
 */
function is_utf8(&$data)
{
    if (is_array($data))
    {
        foreach ($data as $k => $v)
        {
            if (! call_user_func(__FUNCTION__, $v))
            {
                return false;
            }
        }#foreach
        return true;
    }
    else
    {
        return preg_match('/^(?:[\x09\x0A\x0D\x20-\x7E]           # ASCII
                              | [\xC2-\xDF][\x80-\xBF]            # non-overlong 2-byte
                              |  \xE0[\xA0-\xBF][\x80-\xBF]       # excluding overlongs
                              | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
                              |  \xED[\x80-\x9F][\x80-\xBF]       # excluding surrogates
                              |  \xF0[\x90-\xBF][\x80-\xBF]{2}    # planes 1-3
                              | [\xF1-\xF3][\x80-\xBF]{3}         # planes 4-15
                              |  \xF4[\x80-\x8F][\x80-\xBF]{2}    # plane 16
                          )*$/sx', $data);
    }
}

?>
 

SiMM

Новичок
> [\x09\x0A\x0D\x20-\x7E] # ASCII
А зачем исключать коды [\x00-\x08\x0B\x0C\x0E-\x1F\x7F]? Basic Latin остаётся в первозданном виде - никаких запрещённых символов в нём нет.
Вообще, до кучи, как вариант, можно попробовать iconv с IGNORE. Что-то типа
PHP:
var_dump($str == iconv('UTF-32LE','UTF-8',iconv('UTF-8','UTF-32LE//IGNORE',$str)));
 

Rin

*
Регулярное выражение взято с сайта
http://www.w3.org/International/questions/qa-forms-utf-8.html

Можно использовать весь диапазон ASCII [\x00-\x7F], тоже работать будет прекрасно.
 

SiMM

Новичок
> Рег. выражением, кстати, лучше не пользоваться, т.к. у библиотеки PCRE есть внутренние ограничения на длину повторяемых вхождений для * или + (65535 ?)
Интересно, какое при валидации UTF-8 это может иметь значение?
 

SiMM

Новичок
Да ё-маё. Замените preg_match на preg_replace с заменой валидных символов на '' и уберите метасимволы начала и конца строки - всё равно возвращать результат preg_match'а нет никакого смысла - получится что-то вроде is_ruUTF8, только с более расширенным набором символов.
 
Сверху