字符编码简单总结

python字符串和编码

首先,字符串是一种数据类型,我们还经常会用到,然后,最常见的字符串问题就是字符编码问题,经常会看见文件打开一堆乱码,然后手工转utf-8啥的。

字符编码

计算机基础

计算机能够处理的只有数字,所以其他类型的数据想要被计算机识别并处理,首先要进行的就是字符编码,转换成数字之后处理。最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是(11111111,二进制的255),如果要表示更大的整数,就必须更多的字节,比如两个字节可以表示最大整数是65535。

上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为 ASCII 码,一直沿用至今。
ASCII 码一共规定了128个字符的编码,比如空格SPACE是32(二进制00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的一位统一规定为0。

字库表

字库表是一个相当于所有可读或者可显示字符的数据库,字库表决定了整个字符集能够展现表示的所有字符的范围。

字符集

字符集是一个系统支持的所有抽象字符的集合。常见的字符集有ASCIIUTF-8UTG-16GB2313等。

字符编码

字符编码可以看成是一套规则,目的就是在符号集合和数字系统直接建立对应关系。常见的字符编码有UnicodeASCIIUTF-8

三者关系

字库表可以看成是一个全球统一的可读可用的字符库,但是实际使用过程中,很少需要用到这么多字符,例如,中文系统基本就用不到日文的字符,所以也就不需要日文字符的那一部分集合;因此就会诞生一个个的类似于定制的字符集合,这就是字符集,集合中包含了数据和字母的一个个对应关系,这就是字符编码。以ASCII为例:

ASCII

ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统。它主要用于显示现代英语,而其扩展版本EASCII则可以勉强显示其他西欧语言。它是现今最通用的单字节编码系统(但是有被Unicode追上的迹象),并等同于国际标准ISO/IEC 646。

ASCII字符集:主要包括控制字符(回车键、退格、换行键等);可显示字符(英文大小写字符、阿拉伯数字和西文符号)。

ASCII编码:将ASCII字符集转换为计算机可以接受的数字系统的数的规则。使用7位(bits)表示一个字符,共128字符;但是7位编码的字符集只能支持128个字符,为了表示更多的欧洲常用字符对ASCII进行了扩展,ASCII扩展字符集使用8位(bits)表示一个字符,共256字符。

python字符编码

ASCII是出现比较早的字符编码,但是其中只包含了数字和英文大小写字符,对于中文,日文等字符就不适用了,国内学者为了能够完成中文编码,就指定了GB2312编码,同样的,很多国家都有指定自己的编码,这样就会遇到一个问题,中文编码到日文编码的环境查看,会发生乱码,因为根本就不支持这样的字符,为了解决这个问题,一个统一的编码就诞生了Unicode,Unicode编码不同于ASCII的使用一个字节表示一个字符,它使用的是两个字节表示一个字符(中文至少需要两个字节),生僻字符就需要4个字符。
字母’A’用ASCII编码,十进制是65,二进制是01000001;用Unicode编码结果是00000000 01000001
当全部都使用Unicode编码时,乱码问题肯定是得到解决了,但是有个问题,Unicode编码时连个字节表示的一个字符,那么就会比原来使用ASCII编码多出了至少一倍的内存空间占用,怎么都觉得很亏。
所以,为了节约内存空间,又出现了把Unicode编码转换为“可变长编码”的utf-8编码。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间。

下面来弄清楚python的字符编码:
在python3中,字符串是以Unicode编码的,也就是说,支持多语言。由于Python的字符串类型是str,在内存中以Unicode表示,一个字符对应若干个字节。如果要在网络上传输,或者保存到磁盘上,就需要把str变为以字节为单位的bytes
Python对bytes类型的数据用带b前缀的单引号或双引号表示

1
x = b'ABC'

注意区分’ABC’和b’ABC’,前者是str,后者虽然内容显示得和前者一样,但bytes的每个字符都只占用一个字节。
纯英文的str可以用ASCII编码为bytes,内容是一样的,含有中文的str可以用UTF-8编码为bytes。含有中文的str无法用ASCII编码,因为中文编码的范围超过了ASCII编码的范围,Python会报错。

编码及解码

首先python使用的是Unicode编码,字符串进行网络或者磁盘存储时,需要先编码成指定类型bytes,使用encode()方法即可。例如:

1
2
print('中文'.encode('utf-8'))
b'\xe4\xb8\xad\xe6\x96\x87'

反过来,从网络或者磁盘上读取字节流,那么读到的数据是bytes,要把bytes转换为str,就需要使用decode()方法进行解码,例如:

1
2
print(b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8'))
中文

在进行日常python编程中,在操作字符串时,我们经常遇到strbytes的互相转换。为了避免乱码问题,应当始终坚持使用UTF-8编码对strbytes进行转换。

由于Python源代码也是一个文本文件,所以,当你的源代码中包含中文的时候,在保存源代码时,就需要务必指定保存为UTF-8编码。当Python解释器读取源代码时,为了让它按UTF-8编码读取,我们通常在文件开头写上:

1
2
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

pycharm设置方法:
File-Settings-Editor-File and Code Templates-Python Script设置中添加上这两行即可。

以前曾经写过一篇博,关于设置python编码的:python编码

参考链接

廖雪峰的python教程
字符集合字符编码

后记:由于昨天公司发生的很无语加无理取闹的一些事,整个办公室氛围都是压抑的,网上的教程资料也没怎么细致的看进去,写出来的总结也就是乱七八糟的,估计静下来之后我自己都看不懂。。。以后再来修改吧。唉,做技术的,干嘛不追求技术的进步,弄一些有的没的办公室政治呢,有意思吗?

文章目录
  1. 字符编码
    1. 计算机基础
    2. 字库表
    3. 字符集
    4. 字符编码
    5. 三者关系
  2. ASCII
  3. python字符编码
  4. 编码及解码
  5. 参考链接
|