form_tag
或 form_for
辅助函数时,会看到一个名为 _snowman
的隐藏字段,其值为 ☃(Unicode \x9731)。
那么,这是用来做什么的呢?form_tag
或 form_for
辅助函数时,会看到一个名为 _snowman
的隐藏字段,其值为 ☃(Unicode \x9731)。
那么,这是用来做什么的呢?为了强制 Internet Explorer (5、6、7 和 8) 将其参数编码为 Unicode,该参数被添加到表单中。
具体而言,如果用户将浏览器的编码切换为 Latin-1,就会触发此错误。要理解为什么用户会做出看似如此疯狂的决定,请查看这个 Google 搜索。一旦用户将网站置于 Latin-1 模式下,并且使用可以同时被视为 Latin-1 和 Unicode 的字符(例如 é 或 ç,在姓名中很常见),Internet Explorer 将对它们进行 Latin-1 编码。
这意味着,如果用户搜索“Ché Guevara”,服务器端将收到不正确的结果。在 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。
- 现在,绝大多数网络输入都是UTF-8,所以我们将入站参数设置为UTF-8。这将消除许多ASCII-8BIT和UTF-8之间 不兼容编码的情况。
- 您可以安全地忽略params[:_snowman]。
简而言之,您可以安全地忽略此参数。
尽管如此,我仍不确定为什么要支持像Internet Explorer 5这样的旧技术。在我看来,这似乎是非常与Ruby on Rails不符的决定。