Во-первых, обратите внимание, что невозможно определить, принадлежит ли текст определенной нежелательной кодировке. Вы можете только проверить, допустима ли строка в данной кодировке.
Вы можете использовать проверку достоверности UTF-8, доступную в preg_match
[PHP Manual] начиная с 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]< /sup>:
$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
.
Вы не поделились исходным кодом, из которого получено уведомление. Вы должны добавить его, если хотите получить более конкретное предложение.
17.07.2011
preg_match('!.!u', $str)
делает свое дело - он молча проверяет, является ли str utf-8, прежде чем пытаться что-либо найти. - эта точка в регулярном выражении даже не нужна 17.07.2011preg_match
правильно работал и с пустыми строками. 17.07.2011preg_match()
кажется самым быстрым в целом (в PHP 7) как для действительных/недействительных, так и для коротких/длинных строк. 20.07.2016false
сpreg_last_error() === PREG_BAD_UTF8_ERROR
. Документация не очень ясна по этому поводу, но есть ли шанс, что поведение было недавно изменено? 25.06.2019