2. 具體操作
拿到各種編碼的內(nèi)容自然是不用說,那么如果我們想要自己構(gòu)造怎么做呢,看下面:
#coding=utf8
# 字符串前面加u會默認(rèn)構(gòu)造出Unicode的字符串
unicodeString = u'Unicode字符串'
# 字符串前面什么都不加會構(gòu)造出默認(rèn)編碼(首行限定了現(xiàn)在的utf8)的字符串
utf8String = 'Utf-8字符串'
# 當(dāng)然,沒有首行,默認(rèn)的編碼是Ascii
那么他們之間怎么轉(zhuǎn)換呢,同樣很簡單:
# 接上一段程序
# Unicode轉(zhuǎn)化為二進(jìn)制編碼中的一種:utf8
unicodeString.encode('utf8')
# 二進(jìn)制編碼根據(jù)自己的編碼種類轉(zhuǎn)化為Unicode
utf8String.decode('utf8')
# 如果二進(jìn)制編碼中混進(jìn)了奇怪的東西可以根據(jù)需求用特殊的decode策略
print(repr('u8字\x00符串'.decode('utf8', 'replace')))
那么怎么樣會出現(xiàn)問題呢:
# 接著上一段程序說
# 如果我們把他們轉(zhuǎn)化成同樣的編碼方式就可以操作(例如相加)
print(repr(unicodeString + utf8String.decode('utf8')))
print(repr(unicodeString.encode('utf8') + utf8String))
# 但如果不轉(zhuǎn)化,當(dāng)然就會出現(xiàn)滿世界的烤鴨二舅啦
unicodeString + utf8String
# 所以另一方面也發(fā)現(xiàn),編碼轉(zhuǎn)換是需要我們告訴程序怎么做的
# 所有`decode`操作都會生成Unicode編碼,這是為了方便我之前說的大量接受Unicode的內(nèi)部命令
所以我們需要確定程序使用的編碼,這是我們需要告訴程序的東西
- 一方面在操作字符串的時候確定是同種編碼
- 另一方面在使用非自己寫的命令時,一般使用Unicode,或者使用接收二進(jìn)制編碼的命令
#coding=utf8
# 這里拿寫入文件舉例
# 一般使用Unicode
with open('Unicode.txt', 'w')
as f: f.write(u'Unicode測試')
# 或者使用接收二進(jìn)制編碼的命令
with open('Utf8.txt', 'wb')
as f: f.write('Utf8測試')
# 你可以反過來做個測試,自然會報錯
# 二進(jìn)制的命令方便了在不知道怎么解碼的情況下也能進(jìn)行操作(寫入文件)
3. 建議的使用習(xí)慣
相信到這里我已經(jīng)把我對于編碼的理解講完了。
我們?yōu)槭裁磿龅礁魇礁鳂拥木幋a問題:
- 因為我們沒有統(tǒng)一編碼
- 因為我們沒有用對命令(傳對數(shù)據(jù))
所以這里再重申一下八字真言:確定編碼,同類交互
- 碰到問題,問一下自己,我現(xiàn)在是哪種編碼
- 同一種編碼才能交互,那我應(yīng)該是哪種編碼
這里給出我的使用習(xí)慣:
- 確定一種內(nèi)部編碼
- 內(nèi)部編碼的選擇優(yōu)先級如下:程序必須使用的編碼、第三方包使用的編碼、你喜歡的編碼、Unicode
- 在輸出時再更改到特定的編碼
記得在開始整個程序之前確定內(nèi)部的編碼,否則編碼一團(tuán)糟會產(chǎn)生很多不必要的bug。
不要迷信內(nèi)部Unicode,例如Evernote開發(fā)就應(yīng)該根據(jù)第三方包使用的Utf8確定內(nèi)部編碼。
本文版權(quán)歸傳智播客Python培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者出處。謝謝!
作者:傳智播客Python培訓(xùn)學(xué)院
首發(fā):http://m.8y3kgpwe.cn/Python/