在Ruby on Rails 3(目前正在使用Beta 4)中,我看到当使用form_tag
或form_for
帮助时,会出现一个名为_snowman
☃(Unicode\x9731)的隐藏字段.
那么,这是为了什么?
此参数已添加到表单中,以强制Internet Explorer(5,6,7 和 8)将其参数编码为unicode.
具体来说,如果用户将浏览器的编码切换为Latin-1,则可以触发此错误.要了解用户为什么决定做一些看起来如此疯狂的事情,请查看此Google搜索.一旦用户将网站置于Latin-1模式,如果他们使用可以理解为Latin-1和Unicode的字符(例如,é或ç,名称中常见),Internet Explorer将使用拉丁文对其进行编码-1.
这意味着如果用户搜索"ChéGuvara",它将在服务器端错误地通过.在Ruby 1.9中,当文本不可避免地进入正则表达式引擎时,这将导致编码错误.在Ruby 1.8中,它将导致用户的破坏结果.
通过创建一个只能被IE理解为unicode字符的参数,我们强制IE查看accept-charset属性,然后告诉它将所有字符编码为UTF-8,即使是可以编码的字符在Latin-1中.
请记住,在Ruby 1.8中,将Latin-1数据放入UTF-8数据库是非常简单的(因为整个堆栈中没有任何内容检查用户在任何点发送的字节是否是有效的UTF-8字符).因此,Ruby应用程序(以及PHP应用程序等)出现这种面向用户的错误是非常常见的,因此用户尝试将编码更改为姑息措施时非常常见.
总而言之,当我编写这个补丁时,我没有意识到参数的名称会出现在面向用户的地方(它与使用GET操作的表单一样,例如搜索表单).既然如此,我们会将此参数重命名为_e
,并使用更加无害的unicode字符.
这是为了支持Internet Explorer 5并鼓励它使用UTF-8作为其表单.
此处显示的提交消息详细说明如下:
修复几个已知的Web编码问题:
在所有表单上指定accept-charset.所有最近的浏览器以及IE5 +都将使用为表单参数指定的编码
不幸的是,除非表单值中的至少一个字符不在页面的字符集中,否则IE5 +不会查看accept-charset.由于用户可以覆盖默认
字符集(Rails设置为UTF-8),因此我们提供包含unicode字符的隐藏输入,强制IE查看accept-charset.现在绝大多数Web输入都是UTF-8,我们将入站参数设置为UTF-8.这将消除ASCII-8BIT和
UTF-8 之间的许多不兼容编码的情况.你可以安全地忽略params [:_ snowman]
简而言之,您可以安全地忽略此参数.
不过,我不确定为什么我们支持像Internet Explorer 5这样的旧技术.如果你问我,这似乎是一个非Ruby on Rails的决定.