Как обнаружить неправильную строку utf-8 в PHP? - PullRequest
22 голосов
/ 17 июля 2011

Функция iconv иногда выдает мне ошибку:

Notice:
iconv() [function.iconv]:
Detected an incomplete multibyte character in input string in [...]

Есть ли способ обнаружить, что в строке utf-8 есть недопустимые символы, прежде чем помещать данные в inconv?

Ответы [ 4 ]

48 голосов
/ 17 июля 2011

Во-первых, обратите внимание, что невозможно определить, принадлежит ли текст к определенной нежелательной кодировке.Вы можете проверить только допустимость строки в заданной кодировке.

Вы можете использовать проверку достоверности UTF-8, которая доступна в preg_match [Руководство по PHP] начиная с PHP 4.3.5.Он вернет 0 (без дополнительной информации), если задана неверная строка:

$isUTF8 = preg_match('//u', $string);

Другая возможность mb_check_encoding [Руководство по PHP] :

$validUTF8 = mb_check_encoding($string, 'UTF-8');

Еще одна функция, которую вы можете использовать: mb_detect_encoding [Руководство по PHP] :

$validUTF8 = ! (false === mb_detect_encoding($string, 'UTF-8', true));

Важно установить для параметра strict значение true.

Дополнительно iconv [Руководство по PHP] позволяет вам изменять / отбрасывать недопустимые последовательности на лету.(Однако, если iconv встречает такую ​​последовательность, она генерирует уведомление; это поведение нельзя изменить.)

echo 'TRANSLIT : ', iconv("UTF-8", "ISO-8859-1//TRANSLIT", $string), PHP_EOL;
echo 'IGNORE   : ', iconv("UTF-8", "ISO-8859-1//IGNORE", $string), PHP_EOL;

Вы можете использовать @ и проверить длину возвращаемой строки:

strlen($string) === strlen(@iconv('UTF-8', 'UTF-8//IGNORE', $string));

Проверьте также примеры на странице справочника iconv.

Вы не передали исходный код, из которого получено уведомление.Вы должны добавить его, если хотите более конкретное предложение.

0 голосов
/ 17 июля 2011

ставим @ перед iconv () для подавления УВЕДОМЛЕНИЯ и // IGNORE после UTF-8 в идентификаторе кодировки источника для игнорирования недопустимых символов:

@iconv( 'UTF-8//IGNORE', $destinationEncoding, $yourString );
0 голосов
/ 17 июля 2011

Вы можете попробовать использовать mb_detect_encoding, чтобы определить, есть ли у вас другой набор символов (чем UTF-8), тогда mb_convert_encoding для преобразования в UTF-8, если требуется. Скорее всего, люди дают вам действительный контент в другом наборе символов, чем недействительный UTF-8.

0 голосов
/ 17 июля 2011

Спецификация, по которой недопустимы символы в UTF-8, довольно понятна.Вы, вероятно, хотите раздеть их, прежде чем пытаться разобрать его.Их не должно быть, поэтому, если бы вы могли избежать этого даже до создания XML, это было бы еще лучше.

См. Здесь ссылку:

http://www.w3.org/TR/xml/#charsets

Это не полный список, многие парсеры также запрещают использование некоторых управляющих символов с низким номером, но я не могу найти полный список прямо сейчас.

Однако, iconv может иметь встроенную поддержку для этого:

http://www.zeitoun.net/articles/clear-invalid-utf8/start

...