1

我知道有很多关于 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,当您进入低级别时 - 打印出一个字符串就是打印出一个字符串,所以我不明白一种方式如何导致错误,而另一种方式不会。

4

2 回答 2

1

推杆

#encoding: utf-8

在包含 ascii 扩展字符的文件顶部应该修复与编码相关的问题(至少来自项目文件的问题......)

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

于 2012-11-14T21:06:23.880 回答
0

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

# encoding: UTF-8
$KCODE = 'UTF8' unless RUBY_VERSION >= '1.9'

也可能是您的文件未以 UTF-8 编码。为此,您需要的不仅仅是明文标题。在 Eclipse 中,当您另存为文件时,它隐藏在首选项 -> 常规 -> 编辑器 -> 拼写和记事本和大多数 Windows 程序下。该命令是在 Linux 上执行此操作的一种方式,但我相信还有其他方式。我数不清有多少次我看到一个文件说它是 UTF-8,但它实际上是一些其他编码,因为 UTF-8 的功能类似于 ASCII 用于 8 位字符,所以在检查之前你不会经常注意到问题十六进制编辑器中的标题。enca

请花一些时间阅读有关文件编码的信息:

正确地做到这一点非常重要,它可以在您移植到东亚语言时为您节省很多痛苦(您应该始终计划这样做!)

于 2012-11-15T05:05:19.707 回答