我知道有很多关于 Rails 和编码的问题,但我无法找到关于这个特定问题的任何信息。
我有一个 Ruby on Rails 应用程序,使用rails 3.1.3
并在Jruby 1.6.7
. 我们同时支持英语和法语——我们使用I18n
库/gem 来实现这一点。
示例翻译文件部分:
#---- config/locales/en.yml ----
en:
button_label_verify: "Verify"
#---- config/locales/fr.yml ----
fr:
button_label_verify: "Vérifier"
在某些情况下,我收到以下编码错误:
Internal Server Error: Encoding::CompatibilityError incompatible character encodings: UTF-8 and ASCII-8BIT
情况1:
#---- app/views/_view_page.html.erb ----
.....
<h3><%= get_button_label() %></h3>
....
#---- app/helpers/page_helper.rb ----
def get_button_label
return I18n.t(:button_label_verify)
end
这行得通 - 没有编码错误,法语和英语之间的翻译工作得很好。
案例二:
#---- app/views/_view_page.html.erb ----
.....
<h3><%= get_button_label() %></h3>
....
#---- app/helpers/page_helper.rb ----
def get_button_label
return "#{I18n.t(:button_label_verify)}"
end
然而,这不起作用。唯一的区别是返回的值包括字符串中带有计算代码的字符串,而不是类似的东西
return "string " + I18n.t(:button_label_verify)
注意:以上内容也不会导致错误 - 编码问题仅在计算的 I18n 翻译在引号中时出现。
案例3:
#---- app/views/_view_page.html.erb ----
.....
<h3><%= "#{I18n.t(:button_label_verify)}" %></h3>
....
这不会导致错误......所以问题似乎与字符串中的动态代码(带有法语字符)有关,除了打印出从帮助函数返回的字符串之外。
我知道如何解决这个问题/修复它 - 但我想知道是否有人可以提供一些关于为什么会这样的见解 - 这样做有什么好的理由吗?IMO,当您进入低级别时 - 打印出一个字符串就是打印出一个字符串,所以我不明白一种方式如何导致错误,而另一种方式不会。