如何查看文件中使用了哪种编码


23

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


piconv更改编码;)
Rinzwind

是。我已经更改了编码(在1个文件中)。但是我有很多这样的东西,并且想要制作一个小的脚本来控制所有这些脚本,然后在需要时进行隐蔽。但是我想我可以将它们全部转换。如果UTF-8中已包含某些内容,则不会造成任何危害。对?
NonStandardModel

没问题,不是:)只需使用通配符
Rinzwind

Answers:


26

您真的无法自动发现文件最初是否使用编码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

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


ANSI并不是任何字符编码的名称。也许您正在考虑可以用ASCII字符编码表示的ANSI转义码。
卡巴斯德(Kasperd)

@kasperd最有可能他指的是ISO 8859或Window代码页家族之一。对于北美Windows开发人员而言,出于历史原因,ANSI编码通常表示Windows 1252编码。
user1937198

是的,ANSI本质上是ASCII(代码0-127)加上特定于语言环境的代码页(代码128-255)。所以你说得对...
字节指挥官


12

名为的程序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


2
无论如何,它都可以猜测
hobbs

2
file会做出一个猜测,通常这不是一个很好的选择。例如,在我的测试中,它将MacRoman和CP-1252都错误地标识为ISO-8859,结果是“š”和“ß”被打乱了。
Mark

太好了!花了几个小时为我的旧.sql文件找到正确的编码,file并向我证明它确实是gzip压缩文件!
Amirreza Nasiri
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.