29

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

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

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

4

4 回答 4

61

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

自 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还要检查手册页上的示例。

于 2011-07-17T11:41:20.867 回答
0

Put an @ in front of iconv() to suppress the NOTICE and an //IGNORE after UTF-8 in the source encoding id to ignore invalid characters:

@iconv('UTF-8//IGNORE', $destinationEncoding, $yourString);
于 2011-07-17T11:51:42.897 回答
0

UTF-8 中哪些字符无效的规范非常清楚。您可能想在尝试解析之前将其剥离。他们不应该在那里,所以如果你甚至可以在生成 XML 之前避免它,那就更好了。

请参阅此处以获取参考:

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

这不是一个完整的清单。许多解析器也不允许一些低编号的控制字符,但我现在找不到一个完整的列表。

但是,iconv 可能对此具有内置支持:

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

于 2011-07-17T11:40:46.203 回答
0

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

于 2011-07-17T11:41:12.620 回答