1. 常用编码
·ASCII:一个字节(没有汉字),
·Unicode:包含各国语言,通常是两个字节,如果用到特别生僻的字符,需要4个字节
·UTF-8:Unicode的变种,可变长编码,将一个Unicode字符根据大小编码成1-6个字节,常用英文字母1个字节,汉字通常3个字节,生僻字符4-6个字节
很多网页源码:
<meta charset="UTF-8" /> : 表示采用的是UTF-8编码
2. Python字符串
在Python3中,字符串使用Unicode编码,即它支持多国语言。ord()函数获取字符的整数表示,chr()函数把编码转换为对应的字符:
>>> ord('P')
80
>>> chr(81)
'Q'
若知道字符整数编码可写作如下:
>>> '\u4e2d\u6587'
'中文'
Python中,字符串类型为str,在内存中以Unicode编码存在,其一个字符对应若干个字节。如果要在网络上传输,或者保存到磁盘,需要把str变为以字节为单位的bytes。Python对bytes类型的数据用带b前缀的单引号或双引号表示:
x = b'ABC'
'ABC'与b'ABC'的区别:前者为str,后者为bytes,显示内容一样,但bytes的每个字符只占用一个字节。
以Unicode表示的str通过encode()方法可以编码为指定的bytes,如:
>>> 'Python'.encode('ascii')
b'Python'
>>> '中国'.encode('utf-8')
b'\xe4\xb8\xad\xe5\x9b\xbd'
>>> 'Python'.encode('utf-8')
b'Python'
>>> '中国'.encode('ascii')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
可以看出,含有中文的str无法用ASCII编码,因为中文的编码范围超出了ASCII编码范围。
反过来,如果从网络或磁盘上读取字节流,那么读到的是bytes,要将其转变为str,用decode()方法:
>>> b'Python'.decode('utf-8')
'Python'
>>> b'\xe4\xb8\xad\xe5\x9b\xbd'.decode('utf-8')
'中国'
如果bytes中包含无法解码的字节,会报错:
>>> b'\xe4\xb8\xad\xe5'.decode('utf-8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe5 in position 3: unexpected end of data
如果bytes中只有一小部分无效字节,可以传入errors='ignore'忽略错误字节:
>>> b'\xe4\xb8\xad\xe5'.decode('utf-8', errors='ignore')
'中'
len()的使用:对于str,用来计算字符数,对于bytes,用来计算字节数:
>>> len('Python')
6
>>> len('中国')
2
>>> len('Python'.encode('utf-8'))
6
>>> len('中国'.encode('utf-8'))
6
可以看出,转换后,一个中文字符一般占用3个字节,一个英文字符只占用1个字节。在进行str与bytes的转换时,应当始终坚持使用UTF-8编码方式。
特殊情况下,可能需要使用特殊编码,如:
>>> '中国'.encode('gb2312')
b'\xd6\xd0\xb9\xfa'
GB2312编码:GB2312是国家制定的汉字编码标准,使用双子节进行编码。由6763个常用汉字和682个的非汉字字符组成,一个汉字两个字节。对于一些生僻字及古文,使用扩充后的GBK编码。
在写Python源代码.py文件时,一般在开头写上:
#!usr/bin/env python3
# -*- coding: utf-8 -*-
第一行:对于Linux/OS X系统,提示系统这是一个Python可执行程序,对于Windows系统,会忽略该条注释
第二行:告诉Python解释器,按照UTF-8编码来读取源代码,否则源代码中的中文可能出现乱码