对于Python字符编码的理解

首先请理解这句话:对于Python的内建函数encode()和decode()来讲,它都是针对字符内存中(用终端所处理字符的内存表示)介于Unicode与指定编码之间的转换。html

示例一:python

s = '汉字'  # shell终端编码为UTF-8,则s是UTF-8编码的字符
s.decode("UTF-8") # 将s经过UTF-8进行解码,获得u'\u6c49\u5b57'
# 而对于u'\u6c49\u5b57'的Unicode编码内容,能够经过如下方式再次编码成UTF-八、GBK或者其余编码字符
u'\u6c49\u5b57'.encode("UTF-8") # 结果为'\xe6\xb1\x89\xe5\xad\x97',这与repr(s)获得的结果一致,即‘汉字’的UTF-8表示
u'\u6c49\u5b57'.encode("gbk") # 获得结果'\xba\xba\xd7\xd6',即‘汉字’的gbk表示

知道上述基本内容,那即可以对Python处理不一样编码字符时的本质和现象有个直观都印象。这个直观印象来自于咱们直接经过终端进行文本输入时的表现;而涉及字符编码的另外一种操做来自于文本读写正则表达式

再先请参看这篇博文:Python字符编码详解shell

这篇博文提到了咱们读写文件时的两种方式:经过内建函数open()进行读写;经过codecs模块的open()函数进行读写。这两种方式差异在于前者将编码延迟到由用户本身根据实际编码进行处理,后者则是在open时指定编码进行自动处理。函数

示例二:编码

# 如下示例代码来自上述参考博文
f = open('test.txt') # 未指定具体编码
s = f.read() # 读取到的具体内容与文件的实际编码'A'相关,比如是经过'A'编码环境的终端输入获得的文本
f.close()
print type(s) # <type 'str'>
# 已知是GBK编码,解码成unicode
u = s.decode('GBK')  # 对字符内容经过文本实际编码(相似终端环境编码)进行解码,获得Unicode编码

示例三:spa

# 如下示例代码来自上述参考博文
import codecs

f = codecs.open('test.txt', encoding='UTF-8') # 指定具体编码
u = f.read() # 读取到的内容是根据指定编码进行解码后的Unicode字符
f.close()
print type(u) # <type 'unicode'>

f = codecs.open('test.txt', 'a', encoding='UTF-8') # 指定具体编码
f.write(u) # 写入unicode,中间无需进行自动转换

s = '汉' # GBK编码的str
print repr(s) # '\xba\xba'
f.write(s) # 写入GBK编码字符,这里会先将GBK编码的str解码为unicode,再编码为UTF-8后进行写入,自动完成
f.close()

这些是我的对于Python字符编码的理解,若有不妥之处,还望指教。code


补充:htm

场景:将UTF8编码文件读取的“鸟巢(国家体育场)英文(Bird's Nest)”中括弧中内容提取,结果为:鸟巢英文、国家体育场、Bird's Nest。blog

问题:利用内置函数open打开文件,for...in...遍历读取到文本行,正则表达式re.compile(r'[((].*?[))]')匹配时却没法匹配到

解决:利用codecs.open()制定编码打开文件,正则表达式改成re.compile(ur'[((].*?[))]'),可正常匹配。


若是文章对你有用,请在收藏之余“顶/赞”一下以示鼓励吧 (/ω\)