浏览器在将非ASCII字符发布到服务器时如何对其进行编码?

时间:2013-07-10 19:26:57

标签: browser unicode http-post

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

1 个答案:

答案 0 :(得分:1)

  

是否存在浏览器http发布的标准?

现在有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="&#xFFFD;"/>

最后,如果表单包含用于提交表单的所选编码之外的字符,则这些字符将被编码为HTML字符引用。这实在令人困惑,因为这种编码通常不会在表单中使用,而且这是一种无法恢复的错误,因为给定&#233;你永远无法判断用户是否真的键入了&#233;é。 / p>

  

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

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

最近有一个新的IE扩展程序包含在HTML5中,它将添加到您的表单中:

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

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

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

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