Как обнаружить искаженную строку utf-8 в PHP?

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

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

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

4 ответов


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

вы можете использовать проверку действительности 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));

важно установить до 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 страница руководства, а также.

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


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


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

см. здесь для справки:

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

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

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

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


поместите @ перед iconv (), чтобы подавить уведомление, и //IGNORE после UTF-8 в исходном идентификаторе кодировки, чтобы игнорировать недопустимые символы:

@iconv( 'UTF-8//IGNORE', $destinationEncoding, $yourString );