0

我正在尝试将文件中的内容附加到字符串中。

使用 iso-8859-1 编码打开文件并将字符串设置为相同的编码。

但是在尝试连接值时出现incompatible character encodings: UTF-8 and ISO-8859-1 (Encoding::CompatibilityError) 错误。

如果两个字符串的编码相同,为什么会发生这种情况?

实际上我那里没有 UTF-8 字符串。

sql = "
INSERT INTO pages
(meta_title, meta_description, meta_keywords, title, URL, content)
VALUES ('%s', '%s', '%s', '%s', '%s', '%s');
".force_encoding('iso-8859-1') # setting string to iso-8859-1

Dir['./*'].select { |e| File.file? e }.each do |e|
  f = File.open(e, "r:iso-8859-1") # opening the file using iso-8859-1
  # extracting meta, title etc
  puts sql % [*meta, title, url, content]
end
4

2 回答 2

1

尝试对提取的内容使用显式编码。

像这样:

puts sql % [*meta, title, url, content].map { |s| s.force_encoding('iso-8859-1') }
于 2012-10-10T21:55:16.370 回答
1

处理文件时有两种编码:外部编码和内部编码。

外部编码处理磁盘上的实际数据:ruby 将使用该编码来解释从文件中检索到的字节,并将任何写入该编码的字节转换。

内部编码会影响您执行此操作时返回的内容f.read。如果内部编码不是 nil 并且与外部编码不同,ruby 将在您阅读文件时对其进行转码。默认情况下Encoding.default_internal使用,我假设这在您的系统上必须是 UTF-8,结果是 ruby​​ 将您的文件读取为 iso-8859-1,然后在将数据返回给您之前转码为 utf-8。

根据您正在操作的更大环境,您可以更改值Encoding.default_internal或明确设置您想要的内部编码:

File.open(e, "r:iso-8859-1:iso-8859-1")

James Gray 有一篇关于这个的博客文章(实际上是关于 ruby​​ 字符串编码的整个系列)

于 2012-10-10T21:59:45.710 回答