【问题标题】:How does the browser encode non-ASCII characters when posting them to the server?将非 ASCII 字符发布到服务器时,浏览器如何对其进行编码?
【发布时间】:2013-07-08 21:27:33
【问题描述】:

是否有浏览器 http-posting 遵循的标准?如果不是,服务器可以以任何方式检测编码吗?

【问题讨论】:

标签: browser unicode http-post


【解决方案1】:

浏览器 http-posting 是否有一个标准?

现在 HTML5 已经对其进行了编码,但这并不简单。

浏览器在提交表单时用于对文本进行编码的编码通常与用于查看包含该表单的页面的编码相同。因此,如果您包含Content-Type: ...;charset=... HTTP 标头或<meta> 标记,则将使用该编码除非用户故意从浏览器设置中更改页面的编码。

用户通常不会更改此设置,除非您的网页使用了错误的字符集并且无法读取。 (即便如此,该设置在现代浏览器中也变得越来越模糊。)

如果您不设置包含表单的页面的编码,那么您可以获得任何东西;通常它会是与用户所在地区相关的非 UTF 编码,但所有的赌注都没有。

如果您在<form> 元素中包含accept-charset="..." 属性,那么您应该始终获取以该编码提交的表单,而不管表单页面的编码(是否由页面或由用户选择)。不幸的是,accept-charset 在 IE 中被破坏:给定的字符集仅在表单包含可以在页面编码中编码的范围之外的字符时使用。这使得提交的编码根据输入的内容不一致。

如果您想要的字符集是 UTF-8(通常是这样),则有一个解决方法:包含一个包含在任何非 UTF 编码中都不存在的字符的字段。一种可能的选择是替换字符:

<form accept-charset="utf-8">
<input type="hidden" name="enforce-charset" value="&#xFFFD;"/>

最后,如果表单包含在提交表单时选择的编码之外的字符,则这些字符将作为 HTML 字符引用编码发送。这真的很令人困惑,因为这种编码通常不会在表单中使用,而且这是一种不可恢复的修改,因为给定&amp;#233;,您永远无法判断用户是否真的输入了&amp;#233;é

如果不能,服务器能否以任何方式检测编码?

这至少对于 POST 表单应该是可行的,方法是让浏览器在表单提交中传递 Content-Type: ...;charset= 标头。不幸的是,没有真正的浏览器这样做。一些服务器支持它,但是当 Mozilla 的人试图在 Firefox 中实现它时,它破坏了其他服务器的负载,所以现实是它永远不会发生。

最近在 HTML5 中包含了一个较新的 IE 扩展,将添加到您的表单中:

<input type="hidden" name="_charset_"/>

(类型和名称都很重要。)支持此hack 的浏览器将提交一个名为_charset_ 的表单参数,设置为它发送的编码,例如utf-8windows-1252。如果您的服务器知道编码,它可以拾取并使用它。

通常处理表单提交的方法是:在标记为包含 UTF-8 的页面中提供您自己的表单;如果您足够关心用户破坏编码,请包括accept-charset 和强制黑客攻击。

如果您必须接受来自其他地方的表单提交,并且您无法说服他们包含accept-charset 和强制黑客或_charset_ 黑客,那么您所拥有的只是猜测。

【讨论】:

    猜你喜欢
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2018-04-19
    • 2015-12-17
    • 1970-01-01
    • 2011-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多