1.什么是字符串
字符串,在python中用 " "(双引号), ' '(单引号),''' '''(三引号-用的比较少),包含的一串字符。
Python内部提供了一个关键字str用来描述字符串类型。
举个栗子字符串'JUEJING',以及它的坐标
2.字符串编码
目前的编码演变从最早的ASCII到后续随着需求的增加,演变到我们熟悉的UTF,Unicode等等编码
如下是编码演变示例图(时间轴从上到下)
看到以上的编码演变,ASCII码解决字母和数字的问题,GB2312解决中文问题,但是还有阿拉伯文、西班牙文等,所以就衍生出了Unicode编码
为什么有了Unicode还需要UTF-8?
UTF-8是对Unicode编码的压缩和优化,它不在要求最少使用2个字节,而是将所有字符和符号进行分类:
- ascii码中的内容用1个字节保存
- 欧洲的字符用2个字节保存
- 东亚的字符用3个字节保存
...
因此,UTF-8是目前最常用,也是被推荐使用的字符编码。
好啦,如果大家对编码演变如何而来的,网上有很多资料,动动小手指就可以找到它们的发展史了
回到正题,python2和python3默认的编码是什么?
Python2的 默认编码 是ASCII,不能识别中文字符,需要显式指定字符编码;Python3的 默认编码 为Unicode,可以识别中文字符。
Python2和Python3的解释器使用的默认编码是不一样的,我们可以通过sys.getdefaultencoding() 来获取默认编码:
>>> # Python2
>>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> # Python3
>>> import sys
>>> sys.getdefaultencoding()
'utf-8'
所以,我们会在实践过程中,时常会遇到编码错误,原因就是python解释器的编码不对导致的
对于Python2来讲,Python解释器在读取到中文字符的字节码尝试解码操作,会报如下错误
SyntaxError: Non-ASCII character '\xc4' in file xxx.py on line 11, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
对于python3来说,默认编码是UTF-8,但是并不表示完全可以兼容中文问题。比如在windows上以GBK编码保证的代码,遇到python3解释器执行该代码时,会使用UTF-8来进行解码,同样会解码失败,报错信息如下
SyntaxError: Non-UTF-8 code starting with '\xc4' in file xxx.py on line 11, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
解决办法:
- 创建文件,确定其编码的是否设置成UTF-8
- 为了兼容python2和python3 ,在代码头部声明字符编码。-- coding:utf-8 --**
3.字符串编码和编码方式
引入一个小知识点
UNICODE字符编码,也是一张字符与数字的映射,但是这里的数字被称为代码点(code point), 实际上就是十六进制的数字。
Python官方文档中对Unicode字符串、字节串与编码之间的关系有这样一段描述:
Unicode字符串是一个代码点(code point)序列,代码点取值范围为0到0x10FFFF(对应的十进制为1114111)。这个代码点序列在存储(包括内存和物理磁盘)中需要被表示为一组字节(0到255之间的值),而将Unicode字符串转换为字节序列的规则称为编码。
这里说的编码不是指字符编码,而是指编码的过程以及这个过程中所使用到的Unicode字符的代码点与字节的映射规则。
比如Unicode字符转换成ASCII码
比如Unicode字符转换成UTF-8
简单总结:
编码(encode):将Unicode字符串(中的代码点)转换特定字符编码对应的字节串的过程和规则
解码(decode):将特定字符编码的字节串转换为对应的Unicode字符串(中的代码点)的过程和规则
4.字符串的编码转换
那么大家很容易想到一个问题,就是不同的字符编码的字节可以通过Unicode相互转换吗?答案是肯定的。
Python2中的字符串进行字符编码转换过程是:
字节串-->decode('原来的字符编码')-->Unicode字符串-->encode('新的字符编码')-->字节串
#!/usr/bin/env python
# -*- coding:utf-8 -*-
utf_8_a = '中国'
gbk_a = utf_8_a.decode('utf-8').encode('gbk')
print(gbk_a.decode('gbk'))
输出结果:
中国
Python3中定义的字符串默认就是unicode,因此不需要先解码,可以直接编码成新的字符编码:
字符串-->encode('新的字符编码')-->字节串
#!/usr/bin/env python
# -*- coding:utf-8 -*-
utf_8_a = '中国'
gbk_a = utf_8_a.encode('gbk')
print(gbk_a.decode('gbk'))
输出结果:
中国
总结
Python字符串编码问题,在实际工作运用时常会遇见,只要懂得字符编码的过程,许多问题也能迎忍而解
好啦,我正在学习python小白,盆友圈的小可爱,欢迎大佬们指正和补充,下期见~