如何在 XML (UTF-8) 中嵌入上传的二进制文件 (ASCII-8BIT)



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

因此我得到错误Encoding::UndefinedConversionError"x89" from ASCII-8BIT to UTF-8

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

现在重要的事情-1.pdf:应用程序/八位字节流;字符集=二进制示例.csv:文本/纯文本;字符集=UTF-8调查.png:图像/PNG;字符集=二进制

它不会发生在以下情况下:

my_test.txt:text/plain; charset=us-ascii

我尝试更改编码,但出现相同的错误:

params[:file].read.encode('utf-8')
我在

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

首先,如果不进行某种文本转换,则无法在 XML 文档中嵌入二进制文件。至少PDF文档和PNG图像需要以某种方式编码 - 可能是Base64 - 在您开始尝试将其内容视为字符串而不是字节序列之前。

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

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

在将

字符串嵌入到 xml 中之前,您可以对字符串进行 base 64 编码:

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

现在encoded_string应该能够毫无问题地嵌入。当然,您需要在另一端对其进行解码。

相关内容

最新更新