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

时间:2011-07-17 11:36:24

标签: php encoding utf-8 iconv

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

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

在将数据输入到无线电之前,有没有办法检测utf-8字符串中是否存在非法字符?

4 个答案:

答案 0 :(得分:46)

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

自PHP 4.3.5起,您可以使用preg_match [PHP Manual]中提供的UTF-8有效性检查。如果给出了无效的字符串,它将返回0(没有其他信息):

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

另一种可能性是mb_check_encoding [PHP Manual]

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

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

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

strict参数设置为true

非常重要

此外,iconv [PHP Manual]允许您动态更改/删除无效序列。 (但是,如果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手册页上的示例。

您尚未分享产生通知的源代码。如果你想要一个更具体的建议,你应该添加它。

答案 1 :(得分:0)

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

请参阅此处以获取参考:

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

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

但是,iconv可能内置了对此的支持:

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

在iconv()前加一个@来取消NOTICE,在源编码id中用UTN-8后的// IGNORE忽略无效字符:

@iconv( 'UTF-8//IGNORE', $destinationEncoding, $yourString );