python与编码

来源:互联网 发布:程序员需求量 编辑:程序博客网 时间:2024/06/03 17:21

Python的诞生时间比Unicode要早很多,所以早期Python版本的默认编码是ASCII,现在python2依然默认是ASCII编码,而python3默认是utf-8。

因为Python的诞生比Unicode标准发布的时间还要早,所以最早的Python只支持ASCII编码,普通的字符串’ABC’在Python内部都是ASCII编码的。Python提供了ord()和chr()函数,可以把字母和对应的数字相互转换:

>>>ord('A')65>>>chr(65)A

Python在后来添加了对Unicode的支持,以Unicode表示的
字符串用 u’…’表示,python默认是unicode表示的字符串,所以通常不写u。
python3中str字符串类型在内存中存的是Unicode数据,bytes类型字符串存储的是bytes数据。如下:

name0 = 'abc'name1 = b'abc'name2 = '二刚'name3 =u'二刚'print(type(name0))print(type(name1))print(type(name2))print(type(name3))print(repr(name0))print(repr(name1))print(repr(name2))print(repr(name3))

运行结果:

<class 'str'><class 'bytes'><class 'str'><class 'str'>'abc'b'abc''二刚''二刚'

u’中’u’\u4e2d’是一样的,\u后面是十六进制的Unicode
码。又如,u’A’u’\u0041’也是一样的。
这里写图片描述

把u’xxx’转换为UTF-8编码的’xxx’用encode(‘utf-8’)方法,即编码例如:

>>>u'ABC'.encode('utf-8')b'ABC'>>>u'中文'.encode('utf-8')b'\xe4\xb8\xad\xe6\x96\x87'>>>len(u'ABC')3>>>len(b'ABC')3>>>len(u'中文')2>>>len('\xe4\xb8\xad\xe6\x96\x87')6

英文字符转换后表示的UTF-8的值和Unicode值相等(但占用的存储空间不同),而中文字符转换后1个Unicode字符将变为3个UTF-8字符,你看到的\xe4就是其中一个字节,因为它的值是 228,没有对应的字母可以显示,所以以十六 进制显示字节的数值。len()函数可以返回字符串的长度.

**反过来,把UTF-8编码表示的字符串’xxx’转换为Unicode字符串
u’xxx’用decode(‘utf-8’)方法,即解码**例如:

>>>b'abc'.decode('utf-8')'abc'>>>b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')'中文'u'\u4e2d\u6587'

由于Python源代码也是一个文本文件,所以,当你的源代码中包含中文的时候,在保存源代码时,就需要务必指定保存为UTF-8编码。当Python解释器读取源代码时,为了让它按UTF-8编码读取,我们通常在文件开头写上这两行:

#!/usr/bin/env python# -*- coding: utf-8 -*-

第一行注释是为了告诉Linux/OS X系统,这是一个Python可执行程序,Windows系统会忽略这个注释;
第二行注释是为了告诉Python解释器,按照UTF-8编码读取源代码,否则,你在源代码中写的中文输出可能会有乱码。

简单的总结一下编码bytes数据是为了方便传输与存储,而Unicode数据方便了显示