欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

对于Python字符编码的理解

程序员文章站 2022-04-11 16:51:28
...

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

示例一:

s = '汉字'  # shell终端编码为UTF-8,则s是UTF-8编码的字符
s.decode("UTF-8") # 将s通过UTF-8进行解码,得到u'\u6c49\u5b57'
# 而对于u'\u6c49\u5b57'的Unicode编码内容,可以通过以下方式再次编码成UTF-8、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字符编码详解

这篇博文提到了我们读写文件时的两种方式:通过内建函数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编码

示例三:

# 以下示例代码来自上述参考博文
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字符编码的理解,如有不妥之处,还望指教。


补充:

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

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

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


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

转载于:https://my.oschina.net/iuranus/blog/262914