此输入文本往往有其是不正确的输出编码的字符,如“智能引号”,它来自于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,而且您正在遭受上述浏览器自动转义提交问题。
OK“字节147和148是完全有效的Unicode字符,U + 201C和U + 201D”是我没有得到的部分。浏览器无法识别粘贴测试的编码。它如何知道他们是CP1252智能报价?当然,他们只是字节!或者是147-148的使用如此特殊,可以假设这是安全的? – AmbroseChapel 2009-04-15 20:20:33