在 ERB 中显示 UTF-8 表示“不兼容的字符编码”(不涉及数据库)

Nic*_*oul 1 ruby-on-rails erb utf-8

在我的 ERB 页面中,我想显示此 CSV 文件中配置的国家/地区名称之一:

Suisse
Deutschland
??
Run Code Online (Sandbox Code Playgroud)

这是加载 CSV 的代码config/initializers

require 'csv'
COUNTRIES = CSV.read("#{RAILS_ROOT}/config/countries.csv").flatten
Run Code Online (Sandbox Code Playgroud)

这是ERB中的代码:

<%= "Country:" + COUNTRIES[id].to_s %>
Run Code Online (Sandbox Code Playgroud)

我在 id=0 或 id=1 时显示正常,但当 id=2 时出现错误:

incompatible character encodings: ASCII-8BIT and UTF-8
Run Code Online (Sandbox Code Playgroud)

...错误指向上面的 ERB 线。
如何解决?

不涉及数据库,Ruby 1.9.2-p180。本地化文件中的 UTF-8 显示正常。

emb*_*oss 5

来自CSV#read文档:

此方法还了解一个额外的 :encoding 参数,您可以使用它来指定要读取的文件中数据的编码。除非您的数据在 Encoding::default_external() 中,否则您必须提供此项。CSV 将使用它来确定如何解析数据。

所以为了安全起见,我会首先使用

COUNTRIES = CSV.read("/Users/dumitru/test.csv", { encoding: "UTF-8" }).flatten
Run Code Online (Sandbox Code Playgroud)

并检查什么

COUNTRIES[2].encoding.name
Run Code Online (Sandbox Code Playgroud)

CSV#read在 ERB 模板中执行后直接说 a)和 b) 时。如果它在那里显示“US-ASCII”,那么您应该在解析它们后检查是否有某些东西意外更改了您的国家/地区。至少你可以确定中间有什么奇怪的东西。

我也更喜欢

<%= "Country:" + COUNTRIES[id] %>
Run Code Online (Sandbox Code Playgroud)

因为你那里已经有了字符串。但是,我认为这不会解决问题。

我无法想象有什么东西实际上改变了字符串的内容,但也许编码被重新关联为 US-ASCII。所以你可能有很好的机会使用

COUNTRIES[2].force_encoding("UTF-8")
Run Code Online (Sandbox Code Playgroud)

使用您的字符串以强制关联回 UTF-8。如果那没有帮助,我会尝试

COUNTRIES[2].encode("UTF-8")
Run Code Online (Sandbox Code Playgroud)

如果所有这些方法都失败了,我需要在您尝试在 ERB 模板中呈现字符串时知道编码,以进一步帮助您。