如何查看文件中使用的编码

Non*_*del 29 encoding utf-8

我在视频 omxplayer 中的字幕文件有一些问题。为了解决这个问题,我必须从 windows-1250 转换为 UTF-8 编码。我的问题是,如何查看某些特定文件使用了哪种编码?

Byt*_*der 33

您无法真正自动找出文件最初是否以编码 X 编写。

您可以轻松地做的是验证是否可以使用特定编解码器以某种方式(但不一定正确)成功解码完整文件。如果您发现任何对给定编码无效的字节,则它必须是其他内容。

问题是许多编解码器是相似的并且具有相同的“有效字节模式”,只是将它们解释为不同的字符。例如,ä一种编码可能对应é于另一种或ø第三种编码。计算机无法真正检测出哪种方式来解释字节会导致正确的人类可读文本(除非您为所有类型的语言添加字典并让它执行拼写检查......)。您还必须知道某些字符集实际上是其他字符集的子集,例如 ASCII 编码是最常用的编解码器的一部分,如某些 ANSI 系列或 UTF-8。这意味着例如保存为 UTF-8 的文本仅包含简单的拉丁字符,它将与保存为 ASCII 的同一个文件相同。


但是,让我们从解释您不能做的事情回到您实际可以做的事情:

要对 ASCII/非 ASCII(通常为 UTF-8)文本文件进行基本检查,您可以使用该file命令。但是它不知道很多编解码器,它只检查文件的前几 kB,假设其余部分不包含任何新字符。另一方面,它还可以识别其他常见的文件类型,如各种脚本、HTML/XML 文档和许多二进制数据格式(尽管比较文本文件都无济于事),并且它可能会打印附加信息,无论是非常长的行还是什么使用换行序列的类型(例如 UNIX:LF,Windows:CR+LF)。

$ cat ascii.txt 
I am an ASCII file.
Just text and numb3rs and simple punctuation...

$ cat utf8.txt 
I am a Unicode file.
Special characters like ?€®?¥??ØÞöäüß¡!

$ file ascii.txt utf8.txt 
ascii.txt: ASCII text
utf8.txt:  UTF-8 Unicode text
Run Code Online (Sandbox Code Playgroud)

如果这还不够,我可以在这里为您提供我为这个答案编写的 Python 脚本,它会扫描完整的文件并尝试使用指定的字符集对它们进行解码。如果成功,该编码就是一个潜在的候选者。否则,如果有任何字节无法用它解码,您可以从列表中删除该字符集。


Ark*_*zyk 16

一个名为的程序file可以做到这一点。例子:

$ echo aaa >> FILE
$ file FILE
FILE: ASCII text, with CRLF, LF line terminators
$ echo öäü >> FILE
$ file FILE
FILE: UTF-8 Unicode text, with CRLF, LF line terminators
Run Code Online (Sandbox Code Playgroud)

如果您对它的完成方式感兴趣,请参阅src/encoding.c

  • `file` 是一种猜测,通常它不是一个很好的猜测。例如,在我的测试中,它错误地将 MacRoman 和 CP-1252 识别为 ISO-8859,结果是“š”和“ß”被打乱了。 (4认同)
  • 无论如何,它可以*猜测*。 (3认同)