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

使用Notepad ++打开时,在“编码”菜单中报告其中一些文件具有“ UCS-2 Little Endian”的编码和一些“不带BOM的UTF-8”的编码。

这有什么区别?它们似乎都是完全有效的脚本。没有记事本++怎么知道文件的编码?

评论

使用Firefox有一种非常简单的方法。使用Firefox打开文件,然后单击查看>字符编码。此处详细。

使用启发式。结帐POSIX系统的enca和chardet。

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

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

如果chardet或chardetect在您的系统上不可用,则可以通过软件包管理器安装软件包(例如apt search chardet-在ubuntu / debian上,该软件包通常称为python-chardet或python3-chardet)或通过pip与pip install一起安装chardet(或通过pip安装cchardet获得更快的C优化版本)。

#1 楼

文件通常使用文件头指示其编码。这里有很多例子。但是,即使读取标头,也无法确定文件的真正编码方式。

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

Notepad ++会尽力猜测文件正在使用哪种编码,并且大多数时候会正确处理。有时确实会弄错-这就是为什么有“编码”菜单的原因,因此您可以覆盖其最佳猜测。

对于您提到的两种编码:


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


评论


BOM:msdn.microsoft.com/en-us/library/windows/desktop/…

– Jan Doggen
13年2月15日在10:34

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

–迈克尔·伯格沃德(Michael Borgwardt)
13年2月15日在10:36

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

–迈克尔·伯格沃德(Michael Borgwardt)
13年2月15日在10:39

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

–博士生
2013年12月8日19:39

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

–上一个
14-10-18在18:47

#2 楼

你不能。如果可以的话,那里不会有那么多带有“随机乱码”的网站或文本文件。这就是为什么编码通常与有效载荷一起作为元数据发送的原因。
如果不是这样,则您只能做一个“聪明的猜测”,但结果往往是模棱两可的,因为相同的字节序列可能会在多种编码中有效。

评论


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

–马塞尔
13年2月15日在10:18



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

– DeadMG
13年2月15日在10:24

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

–迈克尔·伯格沃德(Michael Borgwardt)
13年2月15日在10:37

notepad ++可以做到这一点,它可以告诉您文本文件是否为utf-8编码

–user25
18年1月1日14:31