Ruby,“不兼容的字符编码:UTF-8和CP852(Encoding :: CompatibilityError)”

时间:2011-07-31 18:25:26

标签: ruby encoding

为什么

# encoding: utf-8
out=File.open("z\\test.txt", "a") 
out.puts "ç"  
out.close
out=File.open("z\\test.txt", "r")
puts out.read+"ś"

导致“不兼容的字符编码:UTF-8和CP852(编码::兼容性错误)”?

3 个答案:

答案 0 :(得分:3)

ruby​​文件开头的注释,只确定了源编码,即它告诉ruby编码ruby文件的编码。它不会告诉它你打开的文件编码的编码 - 对于它仍然使用系统的默认编码,除非您特别请求另一个。

显然系统的默认编码是CP852,因此如果要使用utf-8打开文件,则必须在打开文件时指定该编码(将:encoding => "utf-8"作为参数传递给{{ 1}})。

答案 1 :(得分:0)

你的脚本在我的盒子上运行正常。

错误来自终端应用程序还是来自Ruby?

我的终端应用设置为使用utf-8。

您可以通过在打开文件时显式提供编码来避免此问题。请参阅http://www.ruby-doc.org/core/classes/File.html#M000069并点击IO :: new。

的链接

答案 2 :(得分:0)

这应该解释很多

# https://pl.wikipedia.org/wiki/Kodowanie_polskich_znak%C3%B3w
inp = "zale\xBFno\x9cci".force_encoding('Windows-1250')

# inp = File.open('content-win-1250.txt', :encoding => 'Windows-1250').read

inp = inp.encode('utf-8')

File.open("tmp.txt", "wb") do |out|
    out.write(inp)
end

# file 'tmp.txt contains "zależności"