【发布时间】:2018-01-07 21:44:06
【问题描述】:
为什么
# 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 (Encoding::CompatibilityError)”?
【问题讨论】:
为什么
# 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 (Encoding::CompatibilityError)”?
【问题讨论】:
您的 ruby 文件开头的注释仅确定源编码,即它告诉 ruby ruby 文件是用哪种编码编码的。它不会告诉它您正在打开的文件是用哪种编码编码的 - 对于除非您特别请求另一个,否则它仍然使用系统的默认编码。
显然你的系统默认编码是 CP852,所以如果你想使用 utf-8 打开一个文件,你必须在打开文件时指定该编码(将:encoding => "utf-8" 作为参数传递给File.open) .
【讨论】:
您的脚本在我的盒子上运行良好。
错误来自您的终端应用程序还是来自 Ruby?
我的终端应用程序设置为使用 utf-8。
您可以通过在打开文件时显式提供编码来避免此问题。请参阅 http://www.ruby-doc.org/core/classes/File.html#M000069 并点击指向 IO::new 的链接。
【讨论】:
这应该解释很多
# 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"
【讨论】: