4

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

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

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

what-matters-now-1.pdf:应用程序/八位字节流;字符集=二进制
example.csv:文本/纯文本;字符集=utf-8
调查.png:图片/png;字符集=二进制

它不会发生在:

my_test.txt:文本/纯文本;charset=us-ascii

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

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

3 回答 3

15

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

于 2012-07-27T08:15:43.383 回答
2

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

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

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

于 2012-04-16T16:33:32.623 回答
0

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

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

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

于 2012-04-16T17:39:47.267 回答