如何修复错误的文本文件编码?

5
我有一个文本文件,声称是UTF-8编码。也就是说,当我调用 file -I $file 时,它会打印 $file:text/plain; charset=utf-8 。但是,当我使用UTF-8编码打开它时,一些字符似乎已经损坏了。也就是说,该文件应该是德语,但是特殊的德语字符,如 ö ,显示为 ö

我猜测声称是UTF-8是错误的,于是执行了 enconv 脚本来猜测实际编码。但不幸的是,enca告诉我不支持德语de

还有其他方法来修复这个文件吗?

3个回答

4
“ö”的UTF-8编码形式为U+00F6,对应的字节是0xC3 0xB6。如果这些字节按照ISO-8859-1解释,则会变成“ö”(U+00C3 U+00B6)。因此,要么文件实际上被读取并解释为ISO-8859-1,即使您期望不是这样,要么存在双重编码:先前,文件或其部分被读取为ISO-8859-1(即使它是UTF-8),然后误解的数据被写出为UTF-8编码。请注意,HTML标签已保留。

实际上可能存在双重编码的情况。有什么方法可以修复吗? - katosh
您尝试过打开文件,执行 :set fenc=latin1 命令,然后保存该文件吗?这似乎可以正确地将 ö 转换为 ö ,并且在操作前后 file 命令都会报告其编码格式为 utf-8 - Nikita Kouevda

3
为了使文件在给定编码下正常读取,需要三个步骤:
  1. 'encoding'控制Vim可以存储和显示的字符,必须能够表示您文件中的所有字符。
  2. 'fileencodings'控制Vim将尝试识别的编码方式,必须设置为可以识别您的文件编码。
  3. 'fileencoding'必须正确设置,通常通过“fileencodings”设置自动检测到,以保存您的文件所使用的编码。
注意(2)不是严格必需的,但如果文件编码未被正确检测,则需要手动以正确的编码重新读取该文件。例如,对于未被识别为utf-8的utf-8文件,可以使用`:e ++enc=utf-8`命令。
参考http://vim.wikia.com/wiki/Working_with_Unicode获取这些概念的详细信息。

谢谢,这个 :e ++enc=utf-8 对我很有帮助;我必须运行该命令,保存,退出并重新打开文件,然后一切都解决了。 - kjones

2
你也可以使用:set encoding命令检查编码,并使用:set encoding=utf-8命令进行设置。如果你仍然看到不正确的字符,那么这些字符可能没有以utf-8的格式写入文件,需要进行转换。 编辑:如果您能提交您的文件,将会更有帮助。

我认为'fileencoding'选项(简称'fenc')可能比'encoding''enc')选项更重要。 - benjifisher
是的,我尝试过将编码设置为多种类型,包括utf-8,但没有任何帮助。:set encoding打印出encoding=utf-8,但似乎是错误的。不幸的是,我不被允许发布整个文件,但这里只有其中一个单词:http://userpage.fu-berlin.de/katosh/problem.txt。 - katosh
1
在 Vim 中的 'encoding' 选项与文件编码写入时的编码几乎没有关系。'encoding' 控制着在 Vim 的深处如何解释和存储字节。你需要使用 'fileencoding' 选项。现在,'encoding' 也稍微有点关系,因为它必须能够表示文件的 'fileencoding' 中的所有字符,以便转换正常工作。 - Ben
谢谢你的澄清! - Alexandre DuBreuil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接