字符串包含NUL字节

时间:2016-05-16 19:21:54

标签: ruby encode

我试图将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

谁能告诉我我在这里做错了什么?

1 个答案:

答案 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*')

  1. file.scan(/......../)
  2. 这里我们将大量的0和1(文件)字符串分成一个包含8个字符的字符串数组。它看起来像是:['00001111','11110000',...]。

    1. arr.map{|s| s.to_i(2)}
    2. 从第1步开始,我们得到一个字符串数组,表示二进制表示法中的不同字符。我们可以通过应用s来转换其中一个字符串(称为s.to_i(2)),因为参数“2”表示方法to_i使用基数2.因此'00000011'.to_i(2)返回3.

      我们使用map将其应用于所有角色。 所以我们现在有一个看起来像[98, 82, 49, 39, ...]的数组。

      1. arr.pack('U*')
      2. 从第2步开始,我们有一个表示每个字符的整数数组。我们现在可以使用pack方法将整数数组转换为字符串。我们用于pack的参数是U,告诉他整数实际上是UTF-8字符。