如何在 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 中配置和验证序列号
如何在反序列化之前使用 System.Text.Json 验证 JSON