如何检测文件的编码?


115

在我的文件系统上(Windows 7),我有一些文本文件(如果需要的话,这些是SQL脚本文件)。

当使用Notepad ++打开时,在“编码”菜单中报告其中一些编码为“ UCS-2 Little Endian”,而某些编码为“ UTF-8不带BOM”。

这里有什么区别?它们似乎都是完全有效的脚本。没有Notepad ++的情况下,我如何分辨文件的编码?


7
使用Firefox有一种非常简单的方法。使用Firefox打开文件,然后单击查看>字符编码。这里详细介绍。
凯瑟琳·加斯尼尔

使用启发式。结帐encachardetPOSIX系统。
Janus Troelsen 2014年

3
我认为替代答案是TRIAL和ERROR。iconv为此特别有用。本质上,您通过不同的编码来迭代损坏的字符串/文本,以查看哪种行之有效。当角色不再损坏时,您将获胜。我想在这里用一个程序化的例子来回答。但这是一个受保护的问题。
布兰登·贝特尔森

FF正在使用Mozilla Charset Detectors。另一种简单的方法是使用MS单词打开文件,即使对于各种古代中文和日语代码页,它也可以正确猜测文件
phuclv

如果您的系统上没有chardetchardetect不可用,则可以通过软件包管理器安装软件包(例如apt search chardet,在ubuntu / debian上,通常将该软件包称为python-chardetpython3-chardet),或者通过pip with pip install chardet(或pip install cchardet对于更快的c优化版本)进行安装。
ccpizza

Answers:


97

文件通常使用文件头指示其编码。有许多例子在这里。但是,即使读取了标头,也无法确定文件实际使用的是哪种编码

例如,对于前三个字节的文件0xEF,0xBB,0xBF可能一个UTF-8编码的文件。但是,它可能是一个ISO-8859-1文件,碰巧以这些字符开头。或者它可能是完全不同的文件类型。

Notepad ++会尽力猜测文件正在使用哪种编码,以及在大多数情况下会正确进行编码。有时确实会出错,这就是为什么存在“编码”菜单的原因,因此您可以覆盖其最佳猜测。

对于两种编码,您提到:

  • “ UCS-2 Little Endian”文件是UTF-16文件(根据我从此处的信息了解),因此可能以前0xFF,0xFE2个字节开头。据我所知,Notepad ++将它们描述为“ UCS-2”,因为它不支持UTF-16的某些方面。
  • “没有BOM的UTF-8”文件没有任何头字节。这就是“没有BOM”的含义。


2
为什么将以BOM表开头的文件自动检测为“没有BOM表的UTF-8”?
Michael Borgwardt

2
如果文件以0xFF,0xFE开头,则应将其自动检测为UTF-16,而不是UCS-2。UCS-2可能是猜中的,因为它主要包含ASCII字符,因此每个其他字节为空。
Michael Borgwardt

2
凭经验,las,元数据(“标题”)也可能是错误的。保存该信息的数据库可能已损坏,或者原始的上传者可能会出错。(在过去的几个月中,这对我们来说是一个严重的问题;一些数据以“ UTF-8”的形式上传,除了“真的是ISO8859-1,因为它们确实相同?!”)!远离元数据的起源;他们只是弄错了……)
Donal Fellows 2013年

1
实际上,我认为编码问题在2014年仍然存在是“很有趣”的,因为世界上没有文件会以“”开头,当我看到加载了错误编码的HTML页面时,我感到非常惊讶。这是一个概率问题。如果另一种编码可以避免使用奇怪的字符,那么选择错误的编码是不可想象的。寻找可以避免使用奇怪字符的编码在我猜的99,9999%情况下都可以工作。但还是有错误..也很使用ASCII而不是UTF8,以节省空间非常混乱的短信..这是令人困惑的初级开发这个想法执行..
Revious

18

你不能。如果可以的话,那里不会有那么多带有“乱码”的网站或文本文件。这就是为什么编码通常与有效载荷一起作为元数据发送的原因。

如果不是这样,您所能做的就是“明智的猜测”,但结果往往是模棱两可的,因为相同的字节序列可能在几种编码中都有效。


2
好的,那么Windows操作系统是否实际上将该信息(元数据)存储在某个地方?在注册表中大概?
Marcel

你错了。那就是代码页-不太一样。有一些算法可以猜测Unicode编码。
DeadMG

6
@Marcel:否。这就是为什么“文本文件”对于除纯ASCII之外的所有内容都存在问题的原因。
Michael Borgwardt

notepad ++可以做到这一点,它可以告诉您文本文件是否为utf-8编码
user25
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.