是否有浏览器 http-posting 遵循的标准?如果不能,服务器可以以任何方式检测编码吗?
1 回答
是否有浏览器 http-posting 遵循的标准?
现在有 HTML5 编码它,但它并不简单。
浏览器在提交表单时用于对文本进行编码的编码通常与用于查看包含该表单的页面的编码相同。因此,如果您已包含Content-Type: ...;charset=...
HTTP 标头或<meta>
标记,则将使用该编码,除非用户故意从浏览器设置中更改页面的编码。
除非您的页面使用了错误的字符集并且无法读取,否则用户通常不会更改此设置。(即便如此,该设置在现代浏览器中也变得越来越模糊。)
如果您不设置包含表单的页面的编码,那么您可以获得任何东西;通常它将是与用户区域相关的非 UTF 编码,但所有的赌注都没有。
如果您accept-charset="..."
在<form>
元素中包含该属性,那么无论表单页面的编码如何(无论是由页面设置还是由用户选择),您都应该始终获得以该编码提交的表单。不幸的是,accept-charset
在 IE 中被破坏:给定的字符集仅在表单包含可以在页面编码中编码的范围之外的字符时使用。这使得提交的编码根据输入的内容不一致。
如果您想要的字符集是 UTF-8(通常会是),则有一个解决方法:包括一个包含在任何非 UTF 编码中都不存在的字符的字段。一种可能的选择是替换字符:
<form accept-charset="utf-8">
<input type="hidden" name="enforce-charset" value="�"/>
最后,如果表单包含在提交表单时选择的编码之外的字符,则这些字符将作为 HTML 字符引用编码发送。这真的很令人困惑,因为这种编码通常不会在表单中使用,而且这是一种不可恢复的修改,因为é
你永远无法判断用户是否真的输入了é
or é
。
如果不能,服务器可以以任何方式检测编码吗?
Content-Type: ...;charset=
通过让浏览器通过表单提交传递标题,这至少对于 POST 表单应该是可行的。不幸的是,没有真正的浏览器这样做。一些服务器支持它,但是当 Mozilla 的人试图在 Firefox 中实现它时,它破坏了其他服务器的负载,所以现实是它永远不会发生。
最近在 HTML5 中包含了一个较新的 IE 扩展,它可以添加到您的表单中:
<input type="hidden" name="_charset_"/>
(类型和名称都很重要。)支持这种 hack 的浏览器将提交一个名为_charset_
set 的表单参数来设置它发送的编码,例如utf-8
,或windows-1252
。如果您的服务器知道编码,它可以拾取并使用它。
通常处理表单提交的方法是:在标记为包含 UTF-8 的页面中提供您自己的表单;如果您足够关心用户破坏编码,请包含accept-charset
和执行黑客攻击。
如果您必须接受来自其他地方的表单提交,并且您无法说服他们包括accept-charset
执行黑客或_charset_
黑客攻击中的任何一个,那么您所拥有的只是猜测。