字符编码

1. 字符编码的作用

计算机只认识0和1组成的二进制序列,因此任何文件中的内容要想被计算机识别或者想存储在计算机上都需要转换为二进制序列。那么字符与二进制序列怎么进行想换转换呢?于是人们尝试建立一个表格来存储一个字符与一个二进制序列的对应关系

  • 编码 将字符转换为对应的二进制序列的过程叫做字符编码
  • 解码 将二进制序列转换为对应的字符的过程叫做字符解码

2. 字符编码的简单发展过程

1) ASCII码诞生

最早建立这个字符与十进制数字对应的关系的是美国,这张表被称为ASCII码(American Standard Code for Information Interface, 美国标准信息交换代码)。ASCII码是基于拉丁字母的一套电脑编程系统,主要用于显示现代英语和其他西欧语言。它被设计为用1个字节来表示一个字符,所以ASCII码表最多只能表示2**8=256个字符。实际上ASCII码表中只有128个字符,剩余的128个字符是预留扩展用的。

2) GBK等各国编码诞生

随着计算机的普及和发展,很过国家都开始使用计算机。大家发现ASCII码预留的128个位置根本无法存储自己国家的文字和字符,因此各个国家开始制定各自的字符编码表,其中中国的的字符编码表有GB2312和GBK。

3) Unicode诞生

后来随着世界互联网的形成和发展,各国的人们开始有了互相交流的需要。但是这个时候就存在一个问题,每个国家所使用的字符编码表都是不同的。比如我们发送一句“你好,我好喜欢你演的爱情动作电影!”给岛国的仓老师,苍老师电脑上用的是日本的字符编码表,因此她的电脑无法正确显示我们发送的内容。这个时候,人们希望有一个世界统一的字符编码表来存放所有国家所使用的文字和符号,这就是Unicode。Unicode又被称为 统一码、万国码、单一码,它是为了解决传统的字符编码方案的局限性而产生的,它为每种语言中的每个字符设定了统一并且为之一的二进制编码。Unicode规定所有的字符和符号最少由2个字节(16位)来表示,所以Unicode码可以表示的最少字符个数为2**16=65536。

4) UTF-8诞生

为什么已经有了Unicode还要UTF-8呢?这是由于当时存储设备是非常昂贵的,而Unicode中规定所有字符最少要由2个字节表示。人们认为像原来ASCII码中的字符用1个字节就可以了,因此人们决定创建一个新的字符编码来节省存储空间。UTF-8是对Unicode编码的压缩和优化,它不在要求最少使用2个字节,而是将所有字符和符号进行分类:

  • ascii码中的内容用1个字节保存
  • 欧洲的字符用2个字节保存
  • 东亚的字符用3个字节保存
  • ...

UTF-8是目前最常用,也是被推荐使用的字符编码。

3. Python中的字符编码问题

我们上面提到过,一般在两个地方会用到字符编码:

  • 磁盘写入或读取数据时;
  • 程序执行时的输入和输出;

磁盘写入或读取数据时使用的字符编码是由编辑器指定的工程或文件的字符编码决定的,这与Python解释器是无关的;但是Python程序执行时,将Python脚本文件加载到内存时所使用的字符编码是主要问题所在。在Python 2中,Python解释器默认使用的是ASCII码,此时如果要运行的程序中如果有中文Python解释器就会报错。

print("你好,世界")

SyntaxError: Non-ASCII character '\xe4' in file C:/Users/wader/PycharmProjects/LearnPython/day01/code.py on line 1, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

这是因为Python解释器执行该程序时试图从ASCII编码表中查找中文字符对应的二进制序列,但是发现找不到。此时要想该程序正常运行,就需要在python脚本文件的开始位置声明该文件的所使用的字符编码:

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

print("你好,世界")

需要说明的是

Python 3的解释器默认使用Unicode编码,它本身是可以对中文字符进行编码和解码的,所以即便不指定字符编码也能正常运行,但是还是建议保留字符编码的声明。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值