字符编码
- ASCII与Unicode的区别
ASCII
编码是1个字节,而Unicode
编码通常是2个字节。
- 计算机系统通用的字符编码方式
在计算机内存中,统一使用Unicode
编码,当需要保存到硬盘
或者需要传输的时候,就转换成UTF-8
编码。
字符串
在Python3
的字符串中,使用Unicode
编码,也就是说,Python
的字符串支持多语言。
1 | >>> print('测试python字符串') |
对于单个字符的编码,Python
提供了ord()
函数获取字符的整数表示,chr()
函数把编码转换成对应的字符:
1 | >>> ord('A') |
由于Python
的字符串类型是str
,在内存中以Unicode
表示,一个字符对应若干个字节。如果要在网络上传输或者保存到磁盘上,就需要把str
变成以字节为单位的bytes
.
bytes
类型的数据用带b
前缀的单引号或双引号表示:
1 | name = b'ABC' |
注意:
'ABC'
和b'ABC'
虽然内容上一样,但是两者是有区别的,'ABC'
是str
,b'ABC'
类型是bytes
并且每个字符都只占用1个字节。
str
编码为bytes
可以将str
类型的字符串编码为指定的bytes
- 通过
ASCII
编码
英文的字符串我们可以用过ASCII
编码,但是中文是不允许的,因为超过了ASCII
的编码范围。中文我们用UTF-8
即可:
1 | >>> 'ABC'.encode('ascii') |
注:在
bytes
中,如果无法显示成ASCII
字符的字节,使用\x##
表示。
bytes
解码为str
我们从网络或磁盘上读取到的都是字节流bytes
,因此我们需要解码为str
,可以使用decode
1 | >>> b'ABC'.decode('ascii') |
如果bytes
中只有一小部分字节是无效的,那么可以传入errors='ignore'
来忽略错误的字节:
1 | >>> b'\xe4\xba\xba\xe6\xb0\x91\xe5\xb8\x81\xaa\xbb\xcc'.decode('utf-8', errors='ignore') |
如果不使用errors='ignore'
,则会报错
1 | >>> b'\xe4\xba\xba\xe6\xb0\x91\xe5\xb8\x81\xaa\xbb\xcc'.decode('utf-8') |
计算字符数
可以使用len()
函数来计算str
的字符数,比如
1 | >>> len('abc') |
计算字节数
如果需要计算一个str
类型的字节数,需要先将str
编码成为bytes
,然后使用len()
函数计算
1 | >>> len('abc'.encode('ascii')) |
从上面可以看到,1个中文
经过UTF-8
编码后通常占用3个字节
,1个英文字符
只占用1个字节
。
由于Python
源代码本身也是一个文本文件
,因此,为了保证使用的编码方式统一,防止含有中文导致乱码,以便Python解释器
读取源文件是按照UTF-8
的方式读取,最好在源文件头部加上:
1 | #!/usr/bin/env python3 |
第一行注释是为了告诉Linux/OS X
系统,这是一个Python
可执行程序,Windows
系统会忽略这个注释。
第二行注释是为了告诉Python解释器
,按照UTF-8
的方式读取源代码,否则如果源文件中含有中文的话可能会导致乱码。
申明了
UTF-8编码
并不意味着你的.py文件
就是UTF-8编码
的,必须并且要确保文本编辑器正在使用UTF-8 without BOM编码
; 如果.py文件
本身使用UTF-8编码
,并且也申明了# -*- coding: utf-8 -*-
,打开命令提示符测试就可以正常显示中文。
格式化
常用格式化占位符如下表:
占位符 | 类型 |
---|---|
%d | 整型 |
%f | 浮点型 |
%s | 字符串 |
%x | 十六进制整数 |
- 通用用法
1 | >>> print('I\'am %s, I am %d years old, grade percentage is %s%%' % ('langke', 18, '90')) |
- 使用
format()
函数
1 | >>> print('我是{0}, 我今年的成绩提高了{1:.2f}%'.format('刘德华', 16.394)) |
小结
目前使用最多的编码方式是UTF-8
,如果没有特别的业务要求,尽量使用UTF-8
编码、解码,以避免乱码以及其他不必要的麻烦。