如何将StringIO(pdf)数据保存到文件中

Par*_*war 4 ruby nokogiri

我想pdf用ruby 保存位于外部远程服务器的文件.该pdf文件即将进入StringIO.我尝试保存数据,File.write但它无法正常工作.我收到了以下错误.

ArgumentError: string contains null byte
Run Code Online (Sandbox Code Playgroud)

现在怎么保存?

7st*_*tud 9

require 'stringio'

sio = StringIO.new("he\x00llo")

File.open('data.txt', 'w') do |f|
  f.puts(sio.read)
end


$ cat data.txt
hello
Run Code Online (Sandbox Code Playgroud)

回复评论:

好的,试试这个:

require 'stringio'

sio = StringIO.new("\c2\xb5") 
sio.set_encoding('ASCII-8BIT')  #Apparently, this is what you have.

File.open('data.txt', 'w:utf-8') do |f|
  f.puts(sio.read)
end

--output:--
1.rb:7:in `write': "\xB5" from ASCII-8BIT to UTF-8 (Encoding::UndefinedConversionError)
Run Code Online (Sandbox Code Playgroud)

要消除该错误,可以将StringIO的编码设置为UTF-8:

require 'stringio'

sio = StringIO.new("\c2\xb5") 
sio.set_encoding('ASCII-8BIT')  #Apparently, this is what you have.

sio.set_encoding('UTF-8')  #Change the encoding to what it should be.

File.open('data.txt', 'w:UTF-8') do |f|
  f.puts(sio.read)
end
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用File.open模式:

require 'stringio'

sio = StringIO.new("\c2\xb5") 
sio.set_encoding('ASCII-8BIT')  #Apparently, this is what you have.

File.open('data.txt', 'w:UTF-8:ASCII-8BIT') do |f|
  f.puts(sio.read)
end
Run Code Online (Sandbox Code Playgroud)

但是,假设数据以UTF-8编码.如果你实际上有二进制数据,即因为它代表一个.jpg文件而没有编码的数据,那么这将无效.