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