如何在 PHP 中验证 utf 序列?

Posted

技术标签:

【中文标题】如何在 PHP 中验证 utf 序列?【英文标题】:How to validate a utf sequence in PHP? 【发布时间】:2011-12-13 17:46:49 【问题描述】:

在将我的网站转换为使用 utf-8 后,我现在面临验证所有传入 utf 数据的前景,以确保其有效且连贯。

似乎有各种正则表达式和 php API 来检测字符串是否为 utf,但我见过的似乎不完整(验证 utf 的正则表达式,但仍允许无效的第 3 个字节等)。

我还关心检测(和防止)过长编码,即可以编码为多字节 utf 序列的 ASCII 字符。

欢迎任何建议或链接!

【问题讨论】:

在 UTF-8 中使用代理对对 ASCII 字符进行编码似乎是非法的。尝试使用 (chr(0b11000001) + chr(0b10000001)).decode('utf-8') 解码 'a' 的代理对会导致 Python 抱怨。 @Kerrek,好的,感谢您的指点。我仍在寻找解决 *** 的方法。 【参考方案1】:

你可以用iconv做很多事情,可以告诉你序列是否是有效的UTF-8。

告诉它从 UTF-8 转换为相同的:

$str = "\xfe\x20"; // Invalid UTF-8
$conv = @iconv('UTF-8', 'UTF-8', $str);
if ($str != $conv) 
    print("Input was not a valid UTF-8 sequence.\n");

询问字符串的长度(以字节为单位):

$str = "\xfe\x20"; // Invalid UTF-8
if (@iconv_strlen($str, 'UTF-8') === false) 
    print("Input was not a valid UTF-8 sequence.\n");

【讨论】:

@JaredFarrish:因为它会在遇到无效序列时发出通知。 太恐怖了! @ 抑制器的合法使用?我一定是在做梦。 ;) @JaredFarrish:这是很小的变化。阅读this one 并告诉我... ;) 你所说的小改动是什么意思? (顺便说一句,链接问题的答案很好。非常有趣,只是不确定我应该推断什么。) @JaredFarrish:如果我没记错的话,“small change”的意思是“not a great deal”(英语不是我的母语)。另一个答案就是我所说的“合法使用 @ 运算符”。【参考方案2】:

mb_check_encoding() 就是为此目的而设计的:

mb_check_encoding($string, 'UTF-8');

【讨论】:

+1,这是更好的解决方案。在开始修改 iconv 之前应该调查一下。 取决于 PHP 版本(查看答案中的链接)。 如果需要,我前段时间写了一个纯PHP版本,你可以找到here(还有改进的余地,但可以。) 感谢本杰明,做更多的测试,但似乎 mb_check_encoding 正在处理我可以扔给它的所有东西(包括超长序列)。一个没有警告的 PHP API,真的可以吗?! :)

以上是关于如何在 PHP 中验证 utf 序列?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Installshield 2010 Premier 中配置和验证序列号

如何删除多个 UTF-8 BOM 序列

如何在 PHP 中验证通过 URL 上传的文件

如何在反序列化之前使用 System.Text.Json 验证 JSON

如何在 mysql 或 php 中将 'u00e9' 转换为 utf8 字符?

如何在 PHP 中验证电子邮件?