我在视频 omxplayer 中遇到了一些字幕文件问题。为了解决这个问题,我必须将 windows-1250 编码转换为 UTF-8 编码。我的问题是,如何才能看到某个特定文件使用了哪种编码?
答案1
您无法真正自动找出文件最初是否是用编码 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
如果这还不够的话,我可以为你提供我为这个答案在这里,它会扫描整个文件并尝试使用指定的字符集对其进行解码。如果成功,则该编码是潜在候选。否则,如果有任何字节无法用它解码,则可以从列表中删除该字符集。
答案2
名为的程序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
如果您有兴趣了解它是如何完成的,请参见src/encoding.c
。