如何在 PHP 中检测格式错误的 UTF-8 字符串?

2022-08-30 14:13:36

iconv 函数有时会给我一个错误:

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

有没有办法在将数据发送到inconv()之前检测UTF-8字符串中存在非法字符?


答案 1

首先,请注意,无法检测文本是否属于特定的不需要的编码。您只能检查字符串在给定编码中是否有效。

您可以使用自 PHP 4.3.5 起在 preg_match [PHP 手册] 中提供的 UTF-8 有效性检查。如果给出无效字符串,它将返回(没有其他信息):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));

请务必将参数设置为 。stricttrue

此外,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


答案 2

您可以尝试 使用 来检测您是否有不同的字符集(与 UTF-8 不同),然后根据需要转换为 UTF-8。更有可能的是,人们以不同的字符集为您提供有效内容,而不是为您提供无效的 UTF-8。mb_detect_encodingmb_convert_encoding


推荐