(翻译)Rails 的 “utf8=✓” 的历史跟删除方法以及 snowman ☃

Rails 中通过 form_tag 与 form_for 来生成 form 的时候,会自动追加 这么一个 input 的元素,submit 的话会添加 utf8=✓ 那么一个参数(parameter)。调查了一下这么做的历史跟删除方法。

历史

在 Rails3 中,为了在 Internet Explorer 5、6、7、8 中把参数用 Unicode 来进行编码,之前提到的heper来生成的form里生成叫做 snowman 的参数。详细经过请看 提交描述添加了 snowman 的 Yehuda Katz 在 stackoverflow 的回答

虽然没用过当时的 rails,不过因为用的是 &#9731 那么个字符,所以就用 _snowman=☃ 来表示了。

正如 Yehuda Katz 写的回答那样,从 _snowman 变成 _e,在此之后 用utf8=✓,或者 还是用_utf8=☃ 的讨论,最后还是 回归为 utf8=✓ 了。大家都很高兴。

删除方法

从所有的 form 中 删除 utf8 的情况

生成 utf8 的 input 标签的代码请看 这里

1
2
3
4
5
6
7
8
9
rails/actionview/lib/action_view/helpers/form_tag_helper.rb
# Creates the hidden UTF8 enforcer tag. Override this method in a helper
# to customize the tag.
def utf8_enforcer_tag
# Use raw HTML to ensure the value is written as an HTML entity; it
# needs to be the right character regardless of which encoding the
# browser infers.
'<input name="utf8" type="hidden" value="&#x2713;" />'.html_safe
end

正如注释写的那样,覆盖 utf8_enforcer_tag 方法(把该代码放到 config/initializers 下)

1
2
3
4
5
6
7
8
9
module ActionView
module Helpers
module FormTagHelper
def utf8_enforcer_tag
''
end
end
end
end

从特定的 form 中删除 utf8 的情况

看了下 rails/actionview/lib/action_view/helpers/form_helper.rbrails/actionview/lib/action_view/helpers/form_tag_helper.rb 的代码。

form_for 的情况

1
form_for @model, enforce_utf8: false do |f|

form_tag 的情况

1
form_tag '/models', enforce_utf8: false do

该文翻译至 这里