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
还要检查手册页上的示例。
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);
UTF-8 中哪些字符无效的规范非常清楚。您可能想在尝试解析之前将其剥离。他们不应该在那里,所以如果你甚至可以在生成 XML 之前避免它,那就更好了。
请参阅此处以获取参考:
http://www.w3.org/TR/xml/#charsets
这不是一个完整的清单。许多解析器也不允许一些低编号的控制字符,但我现在找不到一个完整的列表。
但是,iconv 可能对此具有内置支持:
您可以尝试使用mb_detect_encoding
来检测您是否有不同的字符集(而不是 UTF-8),然后mb_convert_encoding
在需要时转换为 UTF-8。人们更有可能以不同的字符集为您提供有效的内容,而不是为您提供无效的 UTF-8。