如何在 PHP 中检测格式错误的 UTF-8 字符串?
iconv 函数有时会给我一个错误:
Notice:
iconv() [function.iconv]:
Detected an incomplete multibyte character in input string in [...]
有没有办法在将数据发送到inconv()之前检测UTF-8字符串中存在非法字符?
iconv 函数有时会给我一个错误:
Notice:
iconv() [function.iconv]:
Detected an incomplete multibyte character in input string in [...]
有没有办法在将数据发送到inconv()之前检测UTF-8字符串中存在非法字符?
首先,请注意,无法检测文本是否属于特定的不需要的编码。您只能检查字符串在给定编码中是否有效。
您可以使用自 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));
请务必将参数设置为 。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
您可以尝试 使用 来检测您是否有不同的字符集(与 UTF-8 不同),然后根据需要转换为 UTF-8。更有可能的是,人们以不同的字符集为您提供有效内容,而不是为您提供无效的 UTF-8。mb_detect_encoding
mb_convert_encoding