基本概念

字符

汉字、字母、标点符号都是一个字符

字符集

字符是字符集的集合

ASCII字符集,共有128个字符

GB2312字符集,是中国国家标准的简体中文字符集

Unicode字符集,Unicode字符集包含了世界各国语言中使用到的所有字符

字符编码

字符编码,是指对于字符集中国的字符,将其编码为特定的二进制

字符集和字符编码被认为是同等概念,包含字符集和字符编码的含义

常见字符集

ASCII

最小的字符集合,主要包含英文和特殊字符

Unicode

全世界所有语言统一成一套编码方案,详细可查询 unicode.org中文对应表

Unicode 字符集有多种编码标准,比如 UTF-8, UTF-7, UTF-16

UTF-8

针对Unicode的可变长度字符编码,是Unicode的一种实现方式之一

python默认编码

Python2的默认编码是 ascii,Python3 的默认编码是 utf-8

improt sys
sys.getdefaultencoding()

python2 字符类型

python2 字符串有两个类型str和unicode 父类都是basestring

str类型的字符串有多种编码方式,默认是 ascii,还有 gbk,utf-8

unicode 类型的字符串使用 u'...' 的形式来表

UnicodeEncodeError &UnicodeDecodeError

str+unicode问题

str 类型和 unicode 类型操作时,Python2 一律都把 str解码(decode)成 unicode 再运算

错误实例

# python2
s = '你好'     # str 类型, utf-8 编码
u = u'世界'    # unicode 类型
s + u         # 会进行隐式转换,即 s.decode('ascii') + u
Traceback (most recent call last):
  File ""<stdin>"", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)

正确用法

# python2
s = '你好'                 # str 类型,utf-8 编码
u = u'世界'
s.decode('utf-8') + u     # 显示指定 'utf-8' 进行转换
u'\u4f60\u597d\u4e16\u754c'   # 注意这不是错误,这是 unicode 字符串

str传入unicode

函数或类等对象接收的是 str 类型的字符串,传入 unicode,Python2 会默认使用ascii 将其编码成 str 类型再运算

错误实例

# python2
u_str = u'你好'
str(u_str)
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)

# python2
u_str.encode('ascii')   # u_str 是 unicode 字符串

重定向

输出到控制台时,print 使用的是控制台的默认编码,而重定向到文件时,print不知道使用什么编码了,于是就使用了默认编码 ascii 导致出现编码错误。

python hello.py > result

错误实例

# python2
hello = u'你好'
print hello # UnicodeEncodeError

正确实例

# python2
hello = u'你好'
print hello.encode('utf-8')