encoding编码入门


备注

什么是编码及其工作原理?

计算机不能存储字母或其他任何东西 - 它存储位。位可以是0或1(“是”/“否”,“真”/“假” - 因此这些格式称为二进制)。要使用这些位,需要一些规则来将位转换为某些内容。这些规则称为编码 ,其中1/0位的序列代表某些字符。 8位序列称为字节

编码像表一样工作,每个字符与特定字节相关。要以ASCII编码对某些内容进行编码,应该按照从右到左的条目进行编码,搜索与字符相关的位。要将一串位解码为字符,可以从左到右替换字母位。

字节可以用不同的格式表示:例如,二进制的10011111是八进制的237 ,十进制的159和十六进制格式的9F

不同编码之间有什么区别?

第一个字符编码,如8位时代之前的ASCII,仅使用8位中的7位.ASCII用于编码英语,所有26个字母均为大写和小写形式,数字和大量标点符号。 ASCII无法涵盖所有ö-ß-é-å字母的其他欧洲语言 - 因此开发了使用字节的第8位覆盖另外128个字符的编码。

但是一个字节不足以表示超过256个字符的语言 - 例如中文。使用两个字节(16位)可以编码65,536个不同的值。像BIG-5这样的编码将一串比特分成16比特(2字节)的块来编码字符。多字节编码具有节省空间的优点,但是诸如查找子串,比较等操作的缺点都必须在执行此类操作之前将字符解码为unicode代码点(尽管有一些快捷方式,但是)。

另一种类型的编码是每个字符具有可变字节数 - 例如UTF标准。这些标准有一些单位大小, UTF-8为8位,UTF-16为16位,UTF-32为32位。然后标准将一些位定义为标志:如果它们被设置,则单元序列中的下一个单元将被视为同一字符的一部分。如果它们没有设置,则该单元仅完全代表一个字符(例如英语仅占用一个字节,这就是为什么ASCII编码完全映射到UTF-8)。

什么是Unicode?

Unicode,如果是一个巨大的字符集(用一种更容易理解的方式 - 一个表),有1,114,112个代码点,每个代码点代表特定的字母,符号或其他字符。使用Unicode,您可以编写一个文档,其中包含理论上人们使用的任何语言。

Unicode不是一种编码 - 它是一组代码点。有几种方法可以将Unicode代码点编码为位 - 例如UTF-8,-16和-32。

如何用Python检测文本文件的编码?

Python中有一个有用的包 - chardet,它有助于检测文件中使用的编码。实际上没有程序可以100%放心地说使用了哪种编码 - 这就是为什么chardet给编码文件编码的概率最高的原因。 Chardet可以检测以下编码:

  • ASCII,UTF-8,UTF-16(2种变体),UTF-32(4种变体)
  • Big5,GB2312,EUC-TW,HZ-GB-2312,ISO-2022-CN(繁体中文和简体中文)
  • EUC-JP,SHIFT_JIS,CP932,ISO-2022-JP(日文)
  • EUC-KR,ISO-2022-KR(韩文)
  • KOI8-R,MacCyrillic,IBM855,IBM866,ISO-8859-5,windows-1251(西里尔文)
  • ISO-8859-2,windows-1250(匈牙利语)
  • ISO-8859-5,windows-1251(保加利亚语)
  • windows-1252(英文)
  • ISO-8859-7,windows-1253(希腊语)
  • ISO-8859-8,windows-1255(视觉和逻辑希伯来语)
  • TIS-620(泰国语)

您可以使用pip命令安装chardet:

pip install chardet
 

之后您可以在命令行中使用chardet:

% chardetect somefile someotherfile
somefile: windows-1252 with confidence 0.5
someotherfile: ascii with confidence 1.0
 

或者在python中:

import chardet    
rawdata = open(file, "r").read()
result = chardet.detect(rawdata)
charenc = result['encoding']
 

安装或设置

有关设置或安装编码的详细说明。