代码之家  ›  专栏  ›  技术社区  ›  Rafael Lopes

当属性为哈希时,字符串替换为奇怪的字符

  •  0
  • Rafael Lopes  · 技术社区  · 7 年前

    我测试了两种情况,得到了两种截然不同的结果。

    第一:

    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 回复  |  直到 7 年前
        1
  •  1
  •   Aleksei Matiushkin    7 年前

    编码没有错误。

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

    出于某种原因,在打印散列时,Ruby使用了这种表示法(我无法复制它),但简而言之,您看到的字符串已经足够好了。

        2
  •  2
  •   mu is too short    7 年前

    在第一种情况下, data_file 采用UTF-8编码。在第二种情况下, 数据文件 具有二进制(即7位ASCII)编码。

    例如,如果我们从一个简单的utf-8csv文件开始:

    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"]] 
    

    因此,您需要通过以正确的编码读取文件来修复编码。很难说,因为我们不知道怎么说 数据文件 正在打开。

    看一看

    line[6].encoding
    

    你应该看到 #<Encoding:UTF-8> 在第一种情况下,但是 #<Encoding:ASCII-8BIT> 其次。