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

如何在PHP中检测格式错误的utf-8字符串?,php,encoding,utf-8,iconv,Php,Encoding,Utf 8,Iconv,iconv函数有时会给我一个错误: Notice: iconv() [function.iconv]: Detected an incomplete multibyte character in input string in [...] 在将数据放入inconv之前,是否有方法检测utf-8字符串中是否存在非法字符?utf-8中无效字符的规范非常清楚。你可能想在解析之前把它们去掉。它们不应该存在,所以如果在生成XML之前就可以避免,那就更好了 请参见此处以获取参考: 这不是一个完整的列表,

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

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

在将数据放入inconv之前,是否有方法检测utf-8字符串中是否存在非法字符?

utf-8中无效字符的规范非常清楚。你可能想在解析之前把它们去掉。它们不应该存在,所以如果在生成XML之前就可以避免,那就更好了

请参见此处以获取参考:

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

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


您可以尝试使用
mb\u detect\u编码
检测您是否拥有不同的字符集(而不是UTF-8),然后
mb\u convert\u编码
根据需要转换为UTF-8。与提供无效的UTF-8相比,人们更可能以不同的字符集提供有效内容。

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

您可以使用自PHP4.3.5以来在中提供的UTF-8有效性检查。如果给出无效字符串,则返回
0
(无附加信息):

$isUTF8 = preg_match('//u', $string);
另一种可能性是:

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

strict
参数设置为
true
非常重要

此外,允许您动态更改/删除无效序列。(但是,如果
iconv
遇到这样的序列,它会生成通知;此行为无法更改。)

您可以使用
@
并检查返回字符串的长度:

strlen($string) === strlen(@iconv('UTF-8', 'UTF-8//IGNORE', $string));
同时检查
iconv
手册页面上的示例

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

在iconv()前面加一个@以取消通知,在源代码编码id的UTF-8后面加一个//IGNORE以忽略无效字符:

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

与此同时,我发现:我知道如何忽略它,我不知道如何检测它,我不想在代码中默默地传递它。顺便说一句,另一个问题中的
preg_match()
解决方案非常有趣,我同意。你没有错,但似乎
preg_match('!!u',$str)
这是一个诀窍-在尝试查找任何内容之前,它会静默地检查str是否为utf-8。-regexp中的点不是偶数needed@user393087:为了使
preg\u match
方法在空字符串上也能正常工作,我做了一点小小的编辑。@hakre:谢谢你的精彩内容。所有选项的概述都很好!我写了一篇文章来看看哪个更快-
preg\u match()
对于有效/无效字符串和短/长字符串来说似乎是最快的整体(在PHP7下)。@Bananaapple:preg\u。。。PHP中的函数使用PCRE库,如果出现此错误,PHP常量将反映来自PCRE库的错误代码(PCRE_error_BADUTF8)。在引擎盖下。无论您使用的是哪种版本的PHP,都可以通过检查PCRE_version常量和/或phpinfo()来检查正在使用的PCRE库版本。这可能揭示出变化。有关技术详细信息,请检查“UTF-8字符串中的错误”。请注意,有效的ASCII字符串也是有效的UTF8字符串。这意味着mb_detect_编码将为任何有效UTF8字符串且不包含任何Unicode字符的字符串返回“ASCII”
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( 'UTF-8//IGNORE', $destinationEncoding, $yourString );