Ruby 如何将上载的二进制文件(ASCII-8BIT)嵌入到XML(UTF-8)中?

Ruby 如何将上载的二进制文件(ASCII-8BIT)嵌入到XML(UTF-8)中?,ruby,ruby-on-rails-3,Ruby,Ruby On Rails 3,我有一个文件,它是通过一个常规的表单上传的,这在params散列中给了我一个ActionDispatch::Http::UploadedFile对象,我可以调用.read来获取内容。我现在需要将该文件嵌入到XML文档中。我现在使用一个常规的Ruby字符串来构造XML。Rails字符串的默认编码是utf-8 因此,我得到了错误Encoding::UnfinedConversionError,“\x89”从ASCII-8BIT到UTF-8 以下文件会发生这种情况: what-matters-now-

我有一个文件,它是通过一个常规的
表单上传的
,这在params散列中给了我一个
ActionDispatch::Http::UploadedFile
对象,我可以调用
.read
来获取内容。我现在需要将该文件嵌入到XML文档中。我现在使用一个常规的Ruby字符串来构造XML。Rails字符串的默认编码是utf-8

因此,我得到了错误
Encoding::UnfinedConversionError
“\x89”从ASCII-8BIT到UTF-8

以下文件会发生这种情况:

what-matters-now-1.pdf: application/octet-stream; charset=binary example.csv: text/plain; charset=utf-8 investigations.png: image/png; charset=binary
首先,如果不进行某种文本转换,就不能在XML文档中嵌入二进制文件。在您开始尝试将PDF文档和PNG图像的内容视为字符串而不是字节序列之前,至少需要对其进行编码(可能是这样)

UndefinedConversionError
表示您正试图将文本从Ruby认为的ASCII转换为UTF-8。但源文本包含一个字节,其值为0x89(137十进制),超出ASCII范围。如果源文件是二进制文件,这一点也不意外,base64编码将解决该问题


但是,如果生成该错误的源文件已经是文本,则需要确定并指定它实际使用的字符集。0x89表示它既不是ASCII也不是UTF-8,因此最有可能的选项是Latin-1或Windows-1252。

您可以在将字符串嵌入xml之前对其进行Base64编码:

require 'base64'
encoded_string = Base64.encode64(the_string)

现在
编码的\u字符串
应该可以毫无问题地嵌入。当然,您需要在另一端对其进行解码。

我在尝试打开和写入图片时遇到了相同的问题(错误)。在将“wb”作为权限添加到open方法后,它成功了。早些时候,它是“w”

不幸的是,我无法控制另一端。但我还是会试试看。@Kris记住,如果你嵌入任意二进制文件,它们可能包含
之类的内容,我的逻辑说这一定是答案,我感觉它猜ASCII不正确,所以我尝试了几个Ruby的编码猜测器,我能找到的一个告诉我编码是MACINTOSH。但如果我强制编码并编码为utf-8,我仍然会出错。对不起,这是错误的。该文件是pdf格式的,因此不应进行任何转换。该文件应被视为二进制文件-不幸的是,我不知道如何做。如果不先对二进制文件进行编码,就无法将其嵌入XML文档中。当你以字节的形式操作二进制文件时,你根本不能对它使用任何字符串操作,因为字节流不是字符串。谢谢你的解释。我不知道为什么这不是更高的投票率。太棒了,谢谢!我有一个类似的问题,这正是我必须做的。这就是答案。您需要将类型从
write
更改为
write binary
。因此,
wb
。我尝试上传一个CSV文件(UTF-8),这对我来说很有效。谢谢
params[:file].read.encode('utf-8')
require 'base64'
encoded_string = Base64.encode64(the_string)