2009-04-15 37 views
12

我有一个应用程序,用户在其中输入文本到表单中。我如何在保存之前清理用户输入以进行正确的内容编码?

将数据保存到MySQL数据库(排序规则:utf8_general_ci),然后以XML(编码:UTF-8)形式输出。

问题是人们倾向于从其他来源剪切和粘贴他们的信息,例如Microsoft Word文档或PDF。

此输入文本往往有其是不正确的输出编码的字符,如“智能引号”,它来自于一个文档中Windows-1252 encoding

这会导致问题,显然,转化或在XML否则工作时的事情因为这些角色是非法的。

那么,如何消毒输入?

此前,我已经使用了一些相当蛮力的方法,比如"de-moronize" script,它由一长串搜索和替换操作组成。

这仍然是最好的方法吗?有没有其他方法?

我可以只在表单上设置accept-charset attribute并让浏览器为我做?

如果是这样,哪些浏览器会这样做,并可能有任何问题?

另外,我的数据库如何接受这些字符,它们是UTF-8中的保留/控制字符?

正如你所看到的,我有足够的了解编码知道我有一个问题,但我现在有点不在我的深度...

TIA

回答

9

此输入文本往往有其是不正确的输出编码的字符,如“智能引号”,它来自于Windows的文档事1252编码

“智能引号”(cp1252中的字节147和148)是完全有效的Unicode字符,U + 201C和U + 201D。您的应用程序应该能够无缝处理它们;如果没有,你做错了,很可能所有非ASCII字符都会失败。

无论字符是从某人输入还是从Word中粘贴出来,浏览器都应该向您的应用程序提交UTF-8编码的字符,应该将相同的UTF-8字节存储到数据库中。

如果浏览器没有以UTF-8格式提交,您可能无法设置包含表单的HTML页面的字符集。这可以通过使用来完成:

Content-Type: text/html;charset=utf-8 

HTTP标头和/或:

<meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> 

元件在<头>。

我可以在表单上设置accept-charset属性并让浏览器为我做这件事吗?

没有,接收字符集基本是没用由于IE浏览器,这曲解了它的意思是“尝试使用此charset如果页面上的一个不能编码我们想要的人物”,而不是“始终使用该字符集”。这意味着如果您使用accept-charset,您最终可能会混合使用一次提交的编码,无法找出哪个编码是哪个编码。太好了!

我的数据库如何接受这些字符,这些字符是UTF-8中的保留/控制字符?

在MySQL中,UTF-8只是一个排序规则,用于比较和排序。它仍然将数据存储为字节,并且不关心它们是否不是有效的UTF-8序列。

无论如何,在您的应用中解码和检查传入的UTF-8序列是个好主意,因为在现代Unicode中无效的“短序列”可以隐藏仍会被旧版浏览器识别的“<”字符至少IE6 SP2之前,Opera 7)。

ETA:

所以,我进入包含字节146

没有一个字符串,您输入Unicode字符U + 201B。浏览器处理Unicode字符,而不是字节,直到它必须将序列化表单提交给服务器。然后它决定如何将字符转换为字节,如果页面以UTF-8处理,它将始终选择UTF-8。 (如果它不是UTF-8,浏览器往往以非标准兼容的方式作弊:对于所有不适合编码的字符,它会将它们编码为HTML字符引用,如'&# 8217;'这是错误的,因为你现在无法区分浏览器转义的'&'和真实的用户类型'&'之间的区别,并且它是错误的,因为如果你随后将引用作为未转义的HTML回显看起来像你得到它的权利,这实际上你只是做了一个大的旧的安全漏洞。)

它进入数据库为146

真的,一个'\ x92'字节,不是'\ xC2 \ x92','\ xE2 \ x80 \ x99'或'&#146;'?

它出来时,我公司生产的(UTF-8编码),XML,为146从浏览器

没有抱怨然后,它没有出来作为一个146字节。当在XML文件中给出一个纯粹的'\ x92'时,浏览器将会投诉。(不是一个HTML文件,其中出现无效的UTF-8序列作为缺少字符的字形)。

我怀疑它是作为'&#146'出现的'字符引用,它是格式良好的尽管字符U + 0092是C1控制集的一部分,所以不会渲染任何有用的东西)。如果发生这种情况,您的表单页面将不会被视为UTF-8,而且您正在遭受上述浏览器自动转义提交问题。

+0

OK“字节147和148是完全有效的Unicode字符,U + 201C和U + 201D”是我没有得到的部分。浏览器无法识别粘贴测试的编码。它如何知道他们是CP1252智能报价?当然,他们只是字节!或者是147-148的使用如此特殊,可以假设这是安全的? – AmbroseChapel 2009-04-15 20:20:33

2

你可以尝试的Perl Encode模块。它支持许多字符集之间的转换,包括couse的UTF-8。我刚刚检查了我的Perl安装,并且还支持“cp1252”,根据维基百科,它只是Windows-1252的另一个名称。您可以检查自己用下面的衬板安装:

perl -MEncode -e 'print map {"$_\n"} Encode->encodings(":all");' 
+0

干杯。我已经做到了,我准备好了。 – AmbroseChapel 2009-04-15 08:34:46

1

“我可以在表单上设置accept-charset属性并让浏览器为我做这件事吗?”

只有当你准备信任“浏览器”时 - 这可能适用于某些应用程序,但总的来说,它会让你自己面对恶作剧(或更糟)。

(另见bobince的有关IE的警告......)

伊恩

相关问题