Ruby on Rails 3表单中的 _ Snowman 参数是用来做什么的?

在 Ruby on Rails3(目前使用 Beta 4)中,我发现当使用 form_tagform_for助手时,会出现一个名为 _snowman的隐藏字段,其值为 something (Unicode x9731)。

这是干什么用的?

38379 次浏览

这是为了支持 Internet Explorer 5,并鼓励它使用 UTF-8的形式。

给你看到的提交消息详细说明如下:

修正几个已知的 web 编码问题:

  • 指定所有表单上的接受字符集。所有最近的浏览器,以及 将使用指定的编码 表格参数
  • 不幸的是,除非至少有一个,否则 IE5 + 不会考虑接受字符集 表单值中的字符不是 在页面的字符集。自从 用户可以覆盖默认值
    Charset (Rails 将其设置为 UTF-8) , 我们提供一个隐藏的输入,其中包含 一个 Unicode字符,迫使 IE 看看接受字符集。
  • 现在绝大多数 web 输入是 UTF-8,我们设置入站 参数到 UTF-8。这将 消除许多不相容的情况 在 ASCII-8BIT 和 ASCII-8BIT 之间编码
    UTF-8.
  • 您可以安全地忽略 params [ : _ Snowman ]

简而言之,您可以安全地忽略此参数。

尽管如此,我还是不明白我们为什么要支持 Internet Explorer 5这样的老技术。如果你问我,这似乎是一个非常非 Ruby on Rails 的决定。

这个参数被添加到表单中,以强制 Internet Explorer (5,6,7 abc08)将其参数编码为 unicode。

具体来说,如果用户将浏览器的编码切换到拉丁文1,就可能触发这个 bug。要理解为什么用户会决定做一些看起来如此疯狂的事情,请查看 这个谷歌搜索。一旦用户将网站设置为拉丁1模式,如果他们使用的字符既可以理解为拉丁1,也可以理解为 Unicode (例如,é 或 ç,在名称中通用) ,Internet Explorer 将用拉丁1进行编码。

这意味着,如果用户搜索“ Ché Guevara”,它将在服务器端错误地显示。在 Ruby 1.9中,当文本不可避免地进入正则表达式引擎时,这将导致编码错误。在 Ruby 1.8中,它会导致用户得到错误的结果。

通过创建一个只能被 IE 理解为 Unicode字符的参数,我们迫使 IE 查看接受字符集属性,然后告诉它将所有字符编码为 UTF-8,甚至是那些可以用拉丁文编码的字符。

请记住,在 Ruby 1.8中,将拉丁文 -1数据放入 UTF-8数据库是极其琐碎的事情(因为整个栈中的 没什么都会检查用户在任何时候发送的字节是否为有效的 UTF-8字符)。因此,Ruby 应用程序(和 PHP 应用程序等等)显示这种面向用户的 bug 是非常常见的,因此用户试图更改编码作为一种缓和措施也是非常常见的。

尽管如此,当我编写这个补丁时,我并没有意识到参数的名称会出现在面向用户的地方(它会出现在使用 GET 操作的表单中,比如搜索表单)。既然如此,我们将把这个参数重命名为 _e,并使用一个看起来更无害的 Unicode字符。