gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 16:29:55 24 4
gpt4 key购买 nike

我在使用 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​​ 世界的新手,欢迎任何想法......

最佳答案

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

\u306b\u3064\u3044\u3066

然后你需要在阅读后对其进行反转义。 Ruby 使用字符串文字为您完成此操作,这就是第二种情况对您有用的原因。摘自“Is this the best way to unescape unicode escape sequences in 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/)
}

或者,如果你想让它更具可读性,将替换提取到一个新方法中,并将它添加到 String 类中:

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/)
}

关于ruby - 使用来自外部文件的二进制数据(utf-8 中的字符串),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17832276/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com