我正在测试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"}
,这是一个字符串,在编码中有错误,而不是重音符号。
我究竟做错了什么?
没有“编纂错误”。
"Caixa Econ\xC3\xB4mica Federal" == "Caixa Econômica Federal"
#⇒ true
出于某种原因,当打印出一个哈希时,ruby使用这种表示(虽然我无法重现它),但简而言之,你看到的字符串就足够了。
在第一种情况下,您的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>
。