归因于HASH的字符串替换为奇怪的字符

时间:2019-02-16 04:42:39

标签: ruby encoding character-encoding

我正在测试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"},这是一个字符串,其中包含编码而不是带有重音符号的错误。

我在做什么错了?

2 个答案:

答案 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使用此表示形式(尽管我无法重现它),但简而言之,您看到的字符串就足够了。