我有一堆 .txt,Notepad++ 说(在其下拉“编码”菜单中)是“ANSI”。
其中有德语字符,[äöüß],在 Notepad++ 中显示良好。
但是当我
File.read 'this is a German text example.txt'
他们时,他们并没有出现在irb中。
那么有谁知道我应该给出什么论据
Encoding.default_external=
?
(我想这就是解决方案,对吧?)
当
'utf-8'
或'cp850'
时,它会将其中包含“äöüß”的“ANSI”文件读取为“\xE4\xF6\xFC\xDF”...
(请毫不犹豫地在你的答案中提及明显“显而易见”的事情;我几乎是新手,但仍然知道足以提出这个问题。)
他们的意思可能是 ISO/IEC 8859-1(又名 Latin-1)、ISO-8859-1、ISO/IEC 8859-15(又名 Latin-9)或 Windows-1252(又名 CP 1252)。所有 4 个在位置
ä
处都有 0xE4
。
我在Notepad++论坛上找到了这个问题的答案,2010年由CChris回答,看起来很权威。
答案:
这将是您计算机的系统代码页(代码页 0)。
更多信息:
显示您当前的代码页。
>help chcp
Displays or sets the active code page number.
CHCP [nnn]
nnn Specifies a code page number.
Type CHCP without a parameter to display the active code page number.
>chcp
Active code page: 437
Identifier .NET Name Additional information
437 IBM437 OEM United States
我认为它是“cp1252”,别名“windows-1252”。
阅读 Jörg 的答案后,我返回 ruby-doc.org 上的 Encoding 页面,试图找到他提到的特定编码的引用,就在那时我发现了
Encodings.aliases
方法。
所以我在这个答案的末尾整理了方法。
然后我查看了 notepad++ 中的输出,将其视为“ANSI”和 utf-8,并将其与 irb 中的输出进行比较...
我只能在 irb 输出中找到两个地方,其中 utf-8 文件出现乱码,其方式与在记事本++中以“ANSI”查看时出现的方式完全相同,而这些地方适用于 cp1252 和 cp1254。
cp1252 显然是我的“文件系统”编码,所以我就这么做。
我编写了一个脚本来复制所有转换为 utf-8 的文件,并尝试从 1252 和 1254 开始。
到目前为止,utf-8 正则表达式似乎适用于两组文件。
现在我必须尝试记住在遇到所有这些编码难题之前我实际上想要完成什么。 xD
def compare_encodings file1, file2
file1_probs = []
file2_probs = []
txt = File.open('encoding_test_output.txt','w')
Encoding.aliases.sort.each do |k,v|
Encoding.default_external=k
ename = [k.downcase, v.downcase].join " --- "
s = ""
begin
s << "#{File.read(file1)}"
rescue
s << "nope nope nope"
file1_probs << ename
end
s << "\t| #{ename} |\t"
begin
s << "#{File.read(file2)}"
rescue
s << "nope nope nope"
file2_probs << ename
end
Encoding.default_external= 'utf-8'
txt.puts s.center(58)
puts s.center(58)
end
puts
puts "file1, \"#{file1}\" exceptions from trying to convert to:\n\n"
puts file1_probs
puts
puts "file2, \"#{file2}\" exceptions from trying to convert to:\n\n"
puts file2_probs
txt.close
end
compare_encodings "utf-8.txt", "np++'ANSI'.txt"
显然我发现所有这些编码(由 Visual Studio Code 完成)编码(Windows-1252、ISO8859-1、ISO8859-3 和 ISO8859-15)与 Notepad++ 的 ANSI 编码不同。似乎度数符号 (°) 的编码不同。