字符编码
最早的ASCII,只有127个字母被编到计算机中。中国制定了GB2312编码,用来把中文编进去。其它语言也出现了各自的编码。
为了统一编码,产生了Unicode,它把所有语言都统一到一套编码里,解决了乱码问题,Unicode编码通常是2个字节。
为了节约,出现了“可变长编码”的UTF-8编码,它把Unicode字符编码成1-6个字节,英文字母编码成1个字节,汉字通常是3个。
编码的工作方式为:在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件。
字符 | ASCII | Unicode | UTF-8 |
A | 01000001 | 00000000 01000001 | 01000001 |
中 | 无 | 01001110 00101101 | 11100100 10111000 10101101 |
Python的字符串
Python提供了ord()和chr()函数,可以把字母和对应的数字相互转换;
>>> ord('A')
65
>>> chr(65)
'A'
字符串对Unicode的支持用u'...'表示;
>>> print u'中文'
中文
>>> u'中'
u'\u4e2d'
两种类型如何转换?u'...'和u'\u+Unicode编码'两种表达是一样的。‘...'是ASCII编码,也可以看作Unicode编码,但u'...'只能看作Unicode编码。另外,可以使用encode将Unicode编码转换为UTF-8编码,使用decode反之。使用len()函数可以返回字符串长度。另外,非列表中的数据在输出时是会转换成中文显示出来的,但列表中的unicode数据不会。
decode encode
str ---------> str(Unicode) ---------> str
>>> print u'中'
中
>>> print u'\u4e2d'
中
#Unicode转UTF-8
>>> u'ABC'.encode('utf-8')
'ABC'
>>> u'中文'.encode('utf-8')
'\xe4\xb8\xad\xe6\x96\x87'
#UTF-8转Unicode
>>> 'abc'.decode('utf-8')
u'abc'
>>> '\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
u'\u4e2d\u6587'
>>> print '\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
中文
>>> len(u'ABC')
3
>>> len('ABC')
3
>>> len(u'中文')
2
>>> len('\xe4\xb8\xad\xe6\x96\x87')
6
保存Python源代码时,需要指明编码类型,下方第一行是Linux/OS X下标明是可执行程序,第二行标明保存为UTF-8编码。另外,在编辑器中需要选择以“UTF-8 without BOM”编码。
#!/usr/bin/env python
#coding:utf-8 或 # -*- coding: utf-8 -*-
格式化
Python中采用的格式化方式和C语言一样,用%实现。常见的占位符有%d、%f、%s和%x(十六进制整数)。
>>> print 'a=%05d,b=%.2f' %(128,0.256)
a=00128,b=0.26