字符串在归属于HASH时替换为奇怪的字符

问题描述 投票:0回答:2

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

我究竟做错了什么?

ruby encoding character-encoding
2个回答
2
投票

没有“编纂错误”。

"Caixa Econ\xC3\xB4mica Federal" == "Caixa Econômica Federal"
#⇒ true

出于某种原因,当打印出一个哈希时,ruby使用这种表示(虽然我无法重现它),但简而言之,你看到的字符串就足够了。


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>

© www.soinside.com 2019 - 2024. All rights reserved.