我试图将IBM437
中的这个文件解码为可读UTF
我想我已经差不多了,但是我&# 39;我得到一个ArgumentError
,其中字符串包含nul
个字节,我知道如何gsub
使用nul
个字节:
.gsub("\u0000", '')
但是我无法弄清楚gsub
字节输出的位置。
以下是来源:
def gather_info
file = './lib/SETI_message.txt'
File.read(file).each_line do |gather|
packed = [gather].pack('b*')
ec = Encoding::Converter.new(packed, 'utf-8')
encoding_forced = packed.encode(ec)
File.open('packed.txt', 'a+'){ |s| s.puts(encoding_forced.gsub("\u0000", '')) }
end
end
gather_info
这里是file
谁能告诉我我在这里做错了什么?
答案 0 :(得分:1)
以下适用于我:
file = File.read('SETI.txt')
packed = file.scan(/......../).map{|s| s.to_i(2)}.pack('U*')
File.write('packed.txt', packed)
让我们打破file.scan(/......../).map{|s| s.to_i(2)}.pack('U*')
:
file.scan(/......../)
这里我们将大量的0和1(文件)字符串分成一个包含8个字符的字符串数组。它看起来像是:['00001111','11110000',...]。
arr.map{|s| s.to_i(2)}
从第1步开始,我们得到一个字符串数组,表示二进制表示法中的不同字符。我们可以通过应用s
来转换其中一个字符串(称为s.to_i(2)
),因为参数“2”表示方法to_i使用基数2.因此'00000011'.to_i(2)
返回3.
我们使用map
将其应用于所有角色。
所以我们现在有一个看起来像[98, 82, 49, 39, ...]
的数组。
arr.pack('U*')
从第2步开始,我们有一个表示每个字符的整数数组。我们现在可以使用pack方法将整数数组转换为字符串。我们用于pack的参数是U,告诉他整数实际上是UTF-8字符。