全國(guó)咨詢(xún)/投訴熱線(xiàn):400-618-4000

首頁(yè)技術(shù)文章正文

Python培訓(xùn)之5分鐘戰(zhàn)勝Python字符編碼(二)

更新時(shí)間:2017-04-16 來(lái)源:黑馬程序員Python培訓(xùn)學(xué)院 瀏覽量:

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)制編碼中的一種:utf8
unicodeString.encode('utf8')
 
# 二進(jìn)制編碼根據(jù)自己的編碼種類(lèi)轉(zhuǎn)化為Unicode
utf8String.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ě)入文件舉例
 
# 一般使用Unicode
with 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


分享到:
在線(xiàn)咨詢(xún) 我要報(bào)名
和我們?cè)诰€(xiàn)交談!