iconv函数有时会给我一个错误:
Notice:
iconv() [function.iconv]:
Detected an incomplete multibyte character in input string in [...]
在将数据输入到无线电之前,有没有办法检测utf-8字符串中是否存在非法字符?
答案 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可能内置了对此的支持:
答案 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 );