我正在测试2种情况,并得到2个奇怪的不同结果。
第一:
hash_data_file = CSV.parse(data_file).map {|line|
puts line[6]
abort
返回值是Caixa Econômica Federal
,带有正确的重音符号。
第二:
hash_data_file = CSV.parse(data_file).map {|line|
puts :bank => line[6]
abort
但是返回的是{:bank=>"Caixa Econ\xC3\xB4mica Federal"}
,这是一个字符串,其中包含编码而不是带有重音符号的错误。
我在做什么错了?
答案 0 :(得分:3)
在第一种情况下,您的data_file
采用UTF-8编码。在第二种情况下,data_file
具有二进制(即7位ASCII)编码。
例如,如果我们从一个简单的UTF-8 CSV文件开始:
bank
Caixa Econômica Federal
,然后使用UTF-8编码进行解析:
CSV.parse(File.open('pancakes.csv', encoding: 'utf-8'))
# [["bank"], ["Caixa Econômica Federal"]]
,然后采用二进制编码:
CSV.parse(File.open('pancakes.csv', encoding: 'binary'))
# [["bank"], ["Caixa Econ\xC3\xB4mica Federal"]]
因此,您需要通过以正确的编码读取文件来修复编码。很难说更多,因为我们不知道data_file
的打开方式。
看看
line[6].encoding
您应该在第一种情况下看到#<Encoding:UTF-8>
,在第二种情况下看到#<Encoding:ASCII-8BIT>
。
答案 1 :(得分:2)
没有“编纂错误”。
"Caixa Econ\xC3\xB4mica Federal" == "Caixa Econômica Federal"
#⇒ true
出于某种原因,在打印散列时,ruby使用此表示形式(尽管我无法重现它),但简而言之,您看到的字符串就足够了。