2. 具体操作
拿到各种编码的内容自然是不用说,那么如果我们想要自己构造怎么做呢,看下面:
#coding=utf8
# 字符串前面加u会默认构造出Unicode的字符串
unicodeString = u'Unicode字符串'
# 字符串前面什么都不加会构造出默认编码(首行限定了现在的utf8)的字符串
utf8String = 'Utf-8字符串'
# 当然,没有首行,默认的编码是Ascii
那么他们之间怎么转换呢,同样很简单:
# 接上一段程序
# Unicode转化为二进制编码中的一种:utf8
unicodeString.encode('utf8')
# 二进制编码根据自己的编码种类转化为Unicode
utf8String.decode('utf8')
# 如果二进制编码中混进了奇怪的东西可以根据需求用特殊的decode策略
print(repr('u8字\x00符串'.decode('utf8', 'replace')))
那么怎么样会出现问题呢:
# 接着上一段程序说
# 如果我们把他们转化成同样的编码方式就可以操作(例如相加)
print(repr(unicodeString + utf8String.decode('utf8')))
print(repr(unicodeString.encode('utf8') + utf8String))
# 但如果不转化,当然就会出现满世界的烤鸭二舅啦
unicodeString + utf8String
# 所以另一方面也发现,编码转换是需要我们告诉程序怎么做的
# 所有`decode`操作都会生成Unicode编码,这是为了方便我之前说的大量接受Unicode的内部命令
所以我们需要确定程序使用的编码,这是我们需要告诉程序的东西
- 一方面在操作字符串的时候确定是同种编码
- 另一方面在使用非自己写的命令时,一般使用Unicode,或者使用接收二进制编码的命令
#coding=utf8
# 这里拿写入文件举例
# 一般使用Unicode
with open('Unicode.txt', 'w')
as f: f.write(u'Unicode测试')
# 或者使用接收二进制编码的命令
with open('Utf8.txt', 'wb')
as f: f.write('Utf8测试')
# 你可以反过来做个测试,自然会报错
# 二进制的命令方便了在不知道怎么解码的情况下也能进行操作(写入文件)
3. 建议的使用习惯
相信到这里我已经把我对于编码的理解讲完了。
我们为什么会碰到各式各样的编码问题:
- 因为我们没有统一编码
- 因为我们没有用对命令(传对数据)
所以这里再重申一下八字真言:确定编码,同类交互
- 碰到问题,问一下自己,我现在是哪种编码
- 同一种编码才能交互,那我应该是哪种编码
这里给出我的使用习惯:
- 确定一种内部编码
- 内部编码的选择优先级如下:程序必须使用的编码、第三方包使用的编码、你喜欢的编码、Unicode
- 在输出时再更改到特定的编码
记得在开始整个程序之前确定内部的编码,否则编码一团糟会产生很多不必要的bug。
不要迷信内部Unicode,例如Evernote开发就应该根据第三方包使用的Utf8确定内部编码。
本文版权归传智播客Python培训学院所有,欢迎转载,转载请注明作者出处。谢谢!
作者:传智播客Python培训学院
首发:http://www.itcast.cn/Python/