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

新手上路,请多包涵

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

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

有没有办法在将数据发送到 inconv() 之前检测 UTF-8 字符串中是否存在非法字符?

原文由 rsk82 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 477
2 个回答

首先,请注意,不可能检测文本是否属于特定的不需要的编码。您只能检查字符串在给定编码中是否有效。

自 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 手册页上的示例。

原文由 hakre 发布,翻译遵循 CC BY-SA 4.0 许可协议

对于使用 json_encode 的那个,试试 json_last_error

 <?php
// An invalid UTF8 sequence
$text = "\xB1\x31";

$json  = json_encode($text);
$error = json_last_error();

var_dump($json, $error === JSON_ERROR_UTF8);

输出

string(4) "null"
bool(true)

原文由 xuhuaiqu 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏