Ruby on rails 3 RubyonRails中UTF-8与ASCII-8BIT编码的不一致性

Ruby on rails 3 RubyonRails中UTF-8与ASCII-8BIT编码的不一致性,ruby-on-rails-3,encoding,utf-8,ruby-on-rails-3.1,i18n-gem,Ruby On Rails 3,Encoding,Utf 8,Ruby On Rails 3.1,I18n Gem,我知道有很多关于rails和编码的问题,但是我还没有找到关于这个特定问题的任何东西 我有一个RubyonRails应用程序,它使用Rails3.1.3,并在JRuby1.6.7下运行。我们支持英语和法语,我们使用I18nlibrary/gem来实现这一点 翻译文件部分示例: #---- config/locales/en.yml ---- en: button_label_verify: "Verify" #---- config/locales/fr.yml ---- fr: but

我知道有很多关于rails和编码的问题,但是我还没有找到关于这个特定问题的任何东西

我有一个RubyonRails应用程序,它使用
Rails3.1.3
,并在
JRuby1.6.7
下运行。我们支持英语和法语,我们使用
I18n
library/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
#---- app/views/_view_page.html.erb ----
.....
<h3><%= "#{I18n.t(:button_label_verify)}" %></h3>
....
注:上述情况也不会导致错误-编码问题仅在计算的I18n翻译在引号中时出现

案例3:

#---- 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
#---- app/views/_view_page.html.erb ----
.....
<h3><%= "#{I18n.t(:button_label_verify)}" %></h3>
....
#----app/views/_view_page.html.erb----
.....
....
这不会导致错误。。。因此,这个问题似乎与字符串中的动态代码(带有法语字符)有关,而不是打印出从helper函数返回的字符串

我知道如何解决这个问题/修复它-但我想知道的是,是否有人能提供一些关于为什么会这样的见解-这种方式有什么好的理由吗?在我看来,当你进入低级时,打印一个字符串就是打印一个字符串,所以我不明白一种方法是如何导致错误的,而另一种方法是如何导致错误的。

#encoding: utf-8
在包含ascii扩展字符的文件顶部,应修复编码相关问题(在elast,来自项目文件的问题…)

我不知道为什么在使用插值时,它对助手不起作用…

#encoding: utf-8
在包含ascii扩展字符的文件顶部,应修复编码相关问题(在elast,来自项目文件的问题…)


我不知道为什么在使用插值时它不能在助手上工作…

有时需要为文件设置KCODE环境变量(这对于ruby 1.8的兼容性很重要):

也可能是您的文件没有用UTF-8编码。为此,您需要的不仅仅是纯文本标题。在Eclipse中,当保存为文件时,它隐藏在“首选项->常规->编辑器->拼写”和“记事本”以及大多数Windows程序下。
enca
命令是在Linux上执行此操作的一种方法,但我相信还有其他方法。我无法计算我看到一个文件说它是UTF-8的次数,但实际上它是一些其他编码,因为UTF-8函数像ASCII一样用于8位字符,所以在十六进制编辑器中检查标题之前,您通常不会注意到问题

请花些时间阅读有关文件编码的内容:


这对于正确操作非常重要,并且可以在以后移植到东亚语言时为您省去很多麻烦(您应该始终计划这样做!)

有时您需要为文件设置KCODE环境变量(这对于ruby 1.8的兼容性很重要):

也可能是您的文件没有用UTF-8编码。为此,您需要的不仅仅是纯文本标题。在Eclipse中,当保存为文件时,它隐藏在“首选项->常规->编辑器->拼写”和“记事本”以及大多数Windows程序下。
enca
命令是在Linux上执行此操作的一种方法,但我相信还有其他方法。我无法计算我看到一个文件说它是UTF-8的次数,但实际上它是一些其他编码,因为UTF-8函数像ASCII一样用于8位字符,所以在十六进制编辑器中检查标题之前,您通常不会注意到问题

请花些时间阅读有关文件编码的内容:


这一点非常重要,要做到正确,它可以帮你在以后移植到东亚语言时省去很多痛苦(你应该一直计划这样做!)

嘿,安东尼-谢谢你的回复!我们已经尝试过很多次了(将
#encoding:utf-8
放在这些文件的顶部…问题仍然存在。我认为这是因为文件本身并不包含扩展字符(那些在YAML文件中)-但是扩展字符被计算成一个ruby字符串-这似乎就是issueYeah,我的意思是,你必须把它放在yaml文件中,而不是helper中…你也试过了吗?是的!一直都是这样:)我们还添加了以下内容,没有什么不同(在environment.rb中):
Encoding.default\u external=Encoding::UTF\u 8 Encoding.default\u internal=Encoding::UTF\u 8
我刚刚在我的一个应用程序中尝试过,它工作正常,但是,我在MRI 1.9.3中。。。可能是jRuby特有的…嘿,安东尼-谢谢你的回复!我们已经尝试过很多次了(将
#encoding:utf-8
放在这些文件的顶部…问题仍然存在。我认为这是因为文件本身并不包含扩展字符(那些在YAML文件中)-但是扩展字符被计算成一个ruby字符串-这似乎就是issueYeah,我的意思是,你必须把它放在yaml文件中,而不是helper中…你也试过了吗?是的!一直都是这样:)我们还添加了以下内容,没有什么不同(在environment.rb中):
Encoding.default\u external=Encoding::UTF\u 8 Encoding.default\u internal=Encoding::UTF\u 8
我刚刚在我的一个应用程序中尝试过,它工作正常,但是,我在MRI 1.9.3中。。。可能是jRuby特定的。。。