一尘不染

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

php

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

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

有没有办法在将数据放入inconv之前检测到utf-8字符串中存在非法字符?


阅读 210

收藏
2020-05-29

共1个答案

一尘不染

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

您可以使用从PHP 4.3.5 开始在preg_match

可用的UTF-8有效性检查。0如果给出了无效的字符串,它将返回(没有其他信息):

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

另一种可能是[mb_check_encoding

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

您可以使用的另一个功能是[mb_detect_encoding

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

strict参数设置为至关重要true

此外,iconv 允许您即时更改/删除无效序列。但是,如果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还要查看手册页上的示例。

您尚未共享发出通知的源代码。如果需要更具体的建议,则应添加它。

2020-05-29