c - 如何将 POST-ed 字符串验证为有效的 UTF-8(在 C 中)?

标签 c utf-8 http-post

我们有一个 CGI 程序,可以处理 POST-ed 表单。一些 POST-ed 文本可以包含非 ASCII 字符——浏览器已经帮助将它们转换为 UTF-8。

我需要“强化”程序以拒绝无效字符串——其中非 ASCII 字符串也不是有效的 UTF-8 字符串。

我想,我会依赖 mbstowcs():

setlocale(LC_CTYPE, "en_US.UTF-8");
unilen = mbstowcs(NULL, foo, 0);
if (unilen == (size_t)-1) {
    ... report an error ...
}

但是,我很难验证这个方法——它可以接受有效的字符串,但我无法想出一个无效的字符串来拒绝...

有人可以确认这是一种正确的方法和/或建议替代方法吗?

请注意,我不关心转换的实际结果——一旦我确信该字符串是有效的 UTF-8,我就会将其复制到电子邮件中(使用 UTF-8 字符集)并让收件人的电子邮件程序处理它。我费心验证的唯一原因是要确保该表单不用于传播任意二进制文件(例如病毒)。

谢谢!

最佳答案

函数文档说

“如果遇到无效的多字节字符,则返回 (size_t)-1 值。”

所以我相信您的验证非常好。就个人而言,我总是发现此值因无效数据而损坏。您可以提交一个任意的偶数长度的十六进制序列来确定。

如果您有疑问并需要进一步验证,gnu iconv 是一个不错的选择

utf-8 validation on SO

关于c - 如何将 POST-ed 字符串验证为有效的 UTF-8(在 C 中)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12900997/

相关文章:

python - 从 python 向带有 windows-1251 编码的页面发送请求

post - 发送 post 请求时类型 'int' 不是类型转换中类型 'String' 的子类型

PHP:将二维数组显示为具有模式形式的表格?

c - 如何理解这样的C宏展开

oracle - 为 Oracle 选择 NLS_LANG

c - 为什么 fork() 打印输出两次?

带有 utf-8 的 Java BufferedWriter 对象

api - 作为 REST API 的一部分上传多个文件的最佳方式?单个或多个 POST 请求?

用C计算圆的面积并在主脚本中调用它

c - 错误 : conflicting types for ‘strlen’