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

Ruby on rails 在ERB中显示UTF-8表示“不兼容的字符编码”(不涉及数据库),ruby-on-rails,utf-8,erb,Ruby On Rails,Utf 8,Erb,在我的ERB页面中,我想显示此CSV文件中配置的国家名称之一: Suisse Deutschland 日本 以下是在配置/初始值设定项中加载CSV的代码: 以下是雇员再培训局的代码: <%= "Country:" + COUNTRIES[id].to_s %> …错误指向上面的ERB线。 如何修复它 不涉及数据库,Ruby 1.9.2-p180。本地化文件中的UTF-8显示良好。您的csv文件似乎未保存在UTF-8中,请尝试将其转换为UTF-8 编辑: 我已经在我本地的mac上测

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

Suisse
Deutschland
日本
以下是在配置/初始值设定项中加载CSV的代码:

以下是雇员再培训局的代码:

<%= "Country:" + COUNTRIES[id].to_s %>
…错误指向上面的ERB线。 如何修复它


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

您的csv文件似乎未保存在UTF-8中,请尝试将其转换为UTF-8

编辑: 我已经在我本地的mac上测试了上面的例子,使用的是相同的ruby版本,它可以正常工作。我从头创建了一个csv,并在irb上进行了测试

ruby-1.9.2-p180 :004 > require 'csv'
=> true  
ruby-1.9.2-p180 :006 > COUNTRIES = CSV.read("/Users/dumitru/test.csv").flatten
=> ["Suisse", "Deutschland", "\xE6\x97\xA5\xE6\x9C\xAC"] 
ruby-1.9.2-p180 :007 > "Country:" + COUNTRIES[0].to_s
=> "Country:Suisse" 
ruby-1.9.2-p180 :009 > "Country:" + COUNTRIES[2].to_s
=> "Country:\xE6\x97\xA5\xE6\x9C\xAC" 

您的csv文件似乎没有保存在UTF-8中,请尝试将其转换为UTF-8

编辑: 我已经在我本地的mac上测试了上面的例子,使用的是相同的ruby版本,它可以正常工作。我从头创建了一个csv,并在irb上进行了测试

ruby-1.9.2-p180 :004 > require 'csv'
=> true  
ruby-1.9.2-p180 :006 > COUNTRIES = CSV.read("/Users/dumitru/test.csv").flatten
=> ["Suisse", "Deutschland", "\xE6\x97\xA5\xE6\x9C\xAC"] 
ruby-1.9.2-p180 :007 > "Country:" + COUNTRIES[0].to_s
=> "Country:Suisse" 
ruby-1.9.2-p180 :009 > "Country:" + COUNTRIES[2].to_s
=> "Country:\xE6\x97\xA5\xE6\x9C\xAC" 
从文档:

此方法还了解一个附加的:encoding参数,您可以使用该参数指定要读取的文件中数据的编码。除非您的数据采用Encoding::default\u external格式,否则必须提供此选项。CSV将使用它来确定如何解析数据

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

COUNTRIES = CSV.read("/Users/dumitru/test.csv", { encoding: "UTF-8" }).flatten
检查一下什么

COUNTRIES[2].encoding.name
在ERB模板中执行时,在CSVread和b后面直接显示a。如果上面写的是US-ASCII,那么你应该检查在解析后是否有东西意外地改变了你的国家。至少你可以确定这两者之间有些奇怪的东西

我也更喜欢

<%= "Country:" + COUNTRIES[id] %>
使用字符串,以强制将关联返回UTF-8。如果那没用,我会试试

COUNTRIES[2].encode("UTF-8")
如果所有这些方法都失败,我需要在您尝试在ERB模板中呈现字符串时了解编码,以进一步帮助您。

来自文档:

此方法还了解一个附加的:encoding参数,您可以使用该参数指定要读取的文件中数据的编码。除非您的数据采用Encoding::default\u external格式,否则必须提供此选项。CSV将使用它来确定如何解析数据

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

COUNTRIES = CSV.read("/Users/dumitru/test.csv", { encoding: "UTF-8" }).flatten
检查一下什么

COUNTRIES[2].encoding.name
在ERB模板中执行时,在CSVread和b后面直接显示a。如果上面写的是US-ASCII,那么你应该检查在解析后是否有东西意外地改变了你的国家。至少你可以确定这两者之间有些奇怪的东西

我也更喜欢

<%= "Country:" + COUNTRIES[id] %>
使用字符串,以强制将关联返回UTF-8。如果那没用,我会试试

COUNTRIES[2].encode("UTF-8")

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

使用Linux isutf8工具确认:我的文件已经是UTF-8关于您的编辑:谢谢!我在我的Ubuntu 2011.04上尝试了相同的命令,得到了完全相同的输出。但是,ERB模板在日语模板上仍然失败。使用Linux isutf8工具确认:我的文件已经是UTF-8关于您的编辑:谢谢!我在我的Ubuntu 2011.04上尝试了相同的命令,得到了完全相同的输出。但是,ERB模板在日语模板上仍然失败。谢谢我添加了,{encoding:UTF-8}正如你所建议的那样,这很有效!奇怪的是,我的Encoding::default_external确实很奇怪,根据文档,它应该会自动工作,然后。。。如果我在我的机器上尝试它,它会正确运行并将其解析为UTF-8字符串。但至少你现在有了一个有效的解决方案:谢谢我添加了,{encoding:UTF-8}正如你所建议的那样,而且有效!奇怪的是,我的Encoding::default_external确实很奇怪,根据文档,它应该会自动工作,然后。。。如果我在我的机器上尝试它,它会正确运行并将其解析为UTF-8字符串。但至少你现在有了一个可行的解决方案: