Ruby 使用外部文件中的二进制数据(utf-8中的字符串)

Ruby 使用外部文件中的二进制数据(utf-8中的字符串),ruby,encoding,Ruby,Encoding,我无法使用UTF-8格式的字符串,例如“\u0161\u010D\u0159\u017E\u00FD”。 当这样的字符串在我的程序中被定义为变量时,它可以正常工作。但是当我从外部文件中读取这样的字符串时,我得到了错误的输出(我没有得到我想要的/期望的)。我肯定错过了一些必要的编码材料 我的代码: file = "c:\\...\\vlmList_unicode.txt" #\u306b\u3064\u3044\u3066 data = File.open(file, 'rb') { |io|

我无法使用UTF-8格式的字符串,例如“\u0161\u010D\u0159\u017E\u00FD”。 当这样的字符串在我的程序中被定义为变量时,它可以正常工作。但是当我从外部文件中读取这样的字符串时,我得到了错误的输出(我没有得到我想要的/期望的)。我肯定错过了一些必要的编码材料

我的代码:

file  = "c:\\...\\vlmList_unicode.txt" #\u306b\u3064\u3044\u3066
data = File.open(file, 'rb') { |io| io.read.split(/\t/) }
puts data
data_var = "\u306b\u3064\u3044\u3066"
puts data_var
输出:

\u306b\u3064\u3044\u3066 # what I don't want
について # what I want
我试图通过指定'rb'来读取二进制格式的文件,但显然还有其他一些问题。。。 我在Netbeans 7.3.1中运行代码,内置JRuby 1.7.3(我也尝试了Ruby 2.0.0,但没有任何效果)


由于我是ruby world的新手,欢迎任何想法…

如果您的文件包含文本转义字符串:

\u306b\u3064\u3044\u3066
然后,你需要在阅读后将其取消。Ruby通过字符串文本为您实现了这一点,这就是为什么第二个案例适用于您。取自“”的答案,您可以使用:

file  = "c:\\...\\vlmList_unicode.txt" #\u306b\u3064\u3044\u3066
data = File.open(file, 'rb') { |io| 
  contents = io.read.gsub(/\\u([\da-fA-F]{4})/) { |m| 
    [$1].pack("H*").unpack("n*").pack("U*")
  }
  contents.split(/\t/)
}
或者,如果希望使其更具可读性,请将替换提取到一个新方法中,并将其添加到
字符串
类中:

class String
  def unescape_unicode
    self.gsub(/\\u([\da-fA-F]{4})/) { |m| 
      [$1].pack("H*").unpack("n*").pack("U*")
    }
  end
end
然后你可以打电话:

file  = "c:\\...\\vlmList_unicode.txt" #\u306b\u3064\u3044\u3066
data = File.open(file, 'rb') { |io| 
  io.read.unescape_unicode.split(/\t/)
}
仅供参考:

data = File.open(file, 'rb') { |io| io.read.split(/\t/) }
可以更简单地写为以下内容之一:

data = File.read(file, 'rb').split(/\t/)
data = File.readlines(file, "\t", 'mode' => 'rb')
(请记住,该文件继承自IO,IO是定义这些方法的地方,因此请查看有关这些方法的文档。)

readlines
采用“separator”参数,在上例中为“\t”。Ruby将用它代替*nix或Mac OS上通常的“\n”或Windows上的“\r\n”,因此将使用制表符分隔符检索记录


这让我有点想知道你为什么要这么做?我从未见过制表符作为记录分隔符,只有“TSV”(制表符分隔值)文件中的列/字段分隔符。因此,我认为您可能应该使用Ruby的类,使用“\t”作为列分隔符。但是,如果没有您正在阅读的实际文件的样本,我无法确定。

谢谢,这很有帮助。也谢谢你的意见,澄清了这个问题。很高兴能帮上忙。既然你觉得它有用,你会考虑投票吗?谢谢,但我还不能投票,因为我的名声。只要我能,我一定会的。再次感谢。实际上,在我的文件选项卡中是列分隔符,行看起来如下:
key1\u306b\u 1 user1
。在没有文本转义字符串的情况下,我使用了
File.readlines
,得到了2D数组。使用文本转义字符串,我无法正确处理文件。在这个页面中,我使用了
File.open(File'rb'){| io | io.read.split(/\t/)}
。在我修改了@joonty的答案后,我又得到了2D数组。当然,我没有用正确的ruby方式来做,但它对我很有用。我需要的是读取这样的文件并创建2D数组。谢谢