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

rsk*_*k82 22 php encoding utf-8 iconv

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

Notice:
iconv() [function.iconv]:
Detected an incomplete multibyte character in input string in [...]
Run Code Online (Sandbox Code Playgroud)

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

hak*_*kre 48

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

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

$isUTF8 = preg_match('//u', $string);
Run Code Online (Sandbox Code Playgroud)

另一种可能性是mb_check_encoding [PHP手册]:

$validUTF8 = mb_check_encoding($string, 'UTF-8');
Run Code Online (Sandbox Code Playgroud)

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

$validUTF8 = ! (false === mb_detect_encoding($string, 'UTF-8', true));
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

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

strlen($string) === strlen(@iconv('UTF-8', 'UTF-8//IGNORE', $string));
Run Code Online (Sandbox Code Playgroud)

另请参阅iconv手册页上的示例.

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

  • @Alan:谢谢你的精彩编辑. (2认同)
  • @hakre:感谢您的精彩内容. (2认同)
  • 所有选项的良好概述!我写了一个[micro-benchmark](https://github.com/mindplay-dk/benchpress/blob/master/example4.php)看看哪个更快-`preg_match()`似乎是整体上最快的PHP 7)都适用于有效/无效和短/长字符串。 (2认同)