PHP: 2 строки - какая из них UTF-8, а какая нет? - PullRequest
0 голосов
/ 13 июня 2009

У меня есть база данных с большим количеством строк. Некоторые из них правильно закодированы в UTF-8, а некоторые нет. Поэтому я установил скрипт, который выбирает 100 строк из БД. Следующая функция решает, содержит ли строка UTF-8 или нет (независимо от того, верна ли она):

function detectUTF8($text) {
    return preg_match('%(?:
        [\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
        )+%xs',
    $text);
}

Вывод скрипта - это строки, содержащие UTF-8 и - после разрыва строки - строку utf8_decode (). Поскольку некоторые строки имеют двойное кодирование, я декодирую все строки, которые вы видите там.

В результате получается список с несколькими записями по 2 строки в каждой: одна правильная, другая неправильная. Вы можете увидеть это здесь . Но как мне определить, какой из них правильный?

Надеюсь, вы мне поможете. Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 15 июня 2009

mb_detect_encoding ($ text, "UTF-8");

Возможно, вам придется собрать php с помощью - enable-mbstring или установить пакет php-mbstring с помощью yum / apt, но php может помочь вам обнаружить кодирование многобайтовой строки.

1 голос
/ 13 июня 2009

Вы можете использовать utf8_decode и проверить с помощью функции detectUTF8, является ли она все еще действующей UTF-8.

...