如何将混合编码的文本文件转换为单一编码?

如何将混合编码的文本文件转换为单一编码?
  1. 我通过将文本文件的不同部分从不同的来源(网页、其他文本文件、pdf 文件)复制到 gedit 并将其保存到文件中来创建文本文件。我猜这就是文本文件中有多种编码的原因,但我不确定。如何避免通过将文本文件的不同部分从不同的来源复制到 gedit 来创建具有混合编码的文本文件?
  2. 每当我用 gedit 打开文件时,gedit 总是能够正确显示或解码文本的每个部分。gedit 似乎可以处理混合编码的文本文件,但我不确定。

    但是当我在 emacs 中打开文件时,会出现无法正确显示的字符。 (我不确定为什么 emacs 不能这样做。) 因此,我想将文件从混合编码转换为单一编码,例如 utf-8。

    因为我认为 gedit 可以检测文本文件不同部分的正确编码,而且我不知道是否有其他应用程序可以这样做,是否可以让 gedit 将文件转换为 utf-8,或者至少告诉我它找到了文件哪个部分的什么编码?

谢谢。

答案1

嗯……说实话,一个文件包含各种编码的概念有点难以理解。如果你有时间,本文(和这个) 值得一读。

对于 Linux 来说,文件是字节序列。如果您要求程序将其解释为文本文件,它将使用字节和字符之间的映射来实现;此映射就是编码。我所知道的几乎所有文本编辑器(不是文字处理器!)都只理解一个文件一种编码的概念。

我不是专家gedit;也许它正在做一些神奇的事情,比如尝试逐行或逐个文本块自动检测编码...如果是这种情况,您可以尝试使用enca(1):

 while read line; do echo $line | enconv -L none -x utf8; done < text.mixed > text.utf8

...但这取决于 enca 猜测您的编码的能力(例如,对东欧编码几乎能很好地工作,但对 Latin1 则不行)。

(1)它在 repos 中,只需使用 安装它即可sudo apt-get enca

答案2

我遇到了同样的问题,并使用 Emacs 解决了它。解决方案引自这里

另一个可能的解决方案是标记每个出现中文字符的区域,然后用 Mx recode-region 重新编码,将“文本确实在”设置为 utf-16-le,将“但被解释为”设置为 utf-16-be。

另一种方法是将具有不同编码的两个部分拆分开,将它们复制到不同的文件中,转换其中一个文件的编码并将其添加到另一个文件中。在我的情况下,这种方法适用于 Atom,但不适用于 Notepad++ (utf16-le/be)。

相关内容