python编码

编码是把信息从一种形式或格式转换为另一种形式或格式的过程,也称为计算机编程语言的代码,简称为编码。在编码时用预先规定的方法将文字、数字或其他对象编成数码,或将信息、数据转换成规定的电脉冲信号。编码在计算机、电视、遥控和、通信等方面广泛使用。另外,解码是编码的逆过程。

1. 字符编码

  • 计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字。因为最早的计算机在设计时采用8个比特(bit) 作为一个字节(byte),所以一个字节能表示的最大的整数就是255(进1111111十进制255)。如果要表示更大的整数,就必须使用更多的字节。比如,两个字节可以表示的最大整数是65535,4个字节可以表示的最大整数是4294 967295。

  • 又因为计算机是 美国人发明的,所以最早只有127个字母被编码到计算机里,也就是大小写英文字母、数字和-些符号,这个编码表称为ASCII编码,比如,大写字母A的编码是65,小写字母z的编码是122。但是要处理中文显然一个字节是不够的,至少需要两个字节,而且还不能和ASCII编码冲突,所以中国制定了GB2312编码,用来把中文编进去。概括下来,在计算机系统中常用的编码格式如下所示:

  • GB2312编码:适用于汉字处理、汉字通信等系统之间的信息交换。

  • 0 GBK 编码:是汉字编码标准之-,是在GB2312- 80标准 基础上的内码扩展规范,使用了双字节编码。

  • ASCII 编码:是对英语字符和二进制之间的关系做的统规定。

  • Unicode 编码:这是一种世界 上所有字符的编码,当然,它没有规定的存储方式。

  • UTF-8 编码:是Unicode Trasiormation Format-8 bit的缩写,UTF-8 是Unicode的一种实现方式。它是可变长的编码方式,可以使用1~4个字节表示一个字符, 可以根据不同的符号而变化字节长度。

2.ASCII 码

  • 我们知道,计算机内部,所有信息最终都是一个二进制值。每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)。也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从00000000到11111111。
  • 上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为 ASCII 码,一直沿用至今。
  • ASCII码一共规定了128个字符的编码,比如空格SPACE是32(二进制00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的一位统一规定为0。

3.Unicode编码

  • 可以想象下,全世界有上百种语言,如果日本人民吧日文编到Shift_JIS里,韩国人民把韩文编到Euc-kr里,各国有各国各国的标准就不会出现冲突。这样照成的结果就是,在多种语言混合的文本中,显示出来就会有乱码。此时Unicode编码格式便运营而生,Unicode编码把所有语言都统一到一套的编码里,这样就不会有乱码的问题了。
  • Unicode当然是一个很大的集合,现在的规模可以容纳100多万个符号。每个符号的编码都不一样,比如,U+0639表示阿拉伯字母Ain,U+0041表示英语的大写字母A,U+4E25表示汉字严。具体的符号对应表,可以查询https://unicode.org,或者专门的汉字对应表。

4.UTF-8编码

  • 互联网的普及,强烈要求出现一种统一的编码方式。UTF-8 就是在互联网上使用最广的一种 Unicode 的实现方式。其他实现方式还包括 UTF-16(字符用两个字节或四个字节表示)和 UTF-32(字符用四个字节表示),不过在互联网上基本不用。重复一遍,这里的关系是,UTF-8 是 Unicode 的实现方式之一。
  • UTF-8 最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。UTF-8 的编码规则很简单,只有二条:
    1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的。
    2)对于n字节的符号(n > 1),第一个字节的前n位都设为1,第n + 1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。
    下表总结了编码规则,字母x表示可用编码的位。
    在这里插入图片描述
  • 根据上表,解读 UTF-8编码非常简单。如果一个字节的第一位是0,则这个字节单独就是一个字符;如果第一位是1,则连续有多少个1,就表示当前字符占用多少个字节。下面,还是以汉字严为例,演示如何实现 UTF-8 编码。严的 Unicode 是4E25(100111000100101),根据上表,可以发现4E25处在第三行的范围(0000 0800 -0000 FFFF),因此严的 UTF-8 编码需要三个字节,即格式1110xxxx 10xxxxxx10xxxxxx。然后,从严的最后一个二进制位开始,依次从后向前填入格式中的x,多出的位补0。这样就得到了,严的 UTF-8 编码是11100100 10111000 10100101,转换成十六进制就是E4B8A5。

5.python中的编码

在默认情况下,python源码文件以utf-8格式进行编码,所有字符串都是Unicode字符串。当然开发者也可以将源文件指定为不同的编码,具体格式如下:

# code:编码格式

例如下面的代码将当前的源文件设置为“GB2312”编码格式:

# code : GB2312

因为python只会检查#、coding和编码字符串,所以读者可能会见到下面声明方式,这是开发者处于美观等原因才这样写的。

# -*- coding :  utf-8 -*-

当在python中使用字符串编码的时候,经常会使用到decode函数和encode函数。特别是在抓取网页的时候,这两个函数用熟练非常有好处。其中encode的功能是把我们看的直观的字符转换为计算机内的字节形式。而函数decode刚好相反,吧字节形式的字符转换成我们看得懂的直观的形式。例如,下面的代码演示了函数的用法。

print("ABC".encode('ascii'))

运行结果:b’ABC’

print('中文'.encode('utf-8'))

运行结果:b’\xe4\xb8\xad\xe6\x96\x87’

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值