首頁技術文章正文

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

更新時間:2017-04-16 來源:黑馬程序員Python培訓學院 瀏覽量:

2. 具體操作
 
拿到各種編碼的內(nèi)容自然是不用說,那么如果我們想要自己構(gòu)造怎么做呢,看下面:
 
#coding=utf8
 
# 字符串前面加u會默認構(gòu)造出Unicode的字符串
unicodeString = u'Unicode字符串'
 
# 字符串前面什么都不加會構(gòu)造出默認編碼(首行限定了現(xiàn)在的utf8)的字符串
utf8String = 'Utf-8字符串'
 
# 當然,沒有首行,默認的編碼是Ascii
 
那么他們之間怎么轉(zhuǎn)換呢,同樣很簡單:
 
# 接上一段程序
 
# Unicode轉(zhuǎn)化為二進制編碼中的一種:utf8
unicodeString.encode('utf8')
 
# 二進制編碼根據(jù)自己的編碼種類轉(zhuǎn)化為Unicode
utf8String.decode('utf8')
 
# 如果二進制編碼中混進了奇怪的東西可以根據(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)化,當然就會出現(xiàn)滿世界的烤鴨二舅啦
unicodeString + utf8String
 
# 所以另一方面也發(fā)現(xiàn),編碼轉(zhuǎn)換是需要我們告訴程序怎么做的
# 所有`decode`操作都會生成Unicode編碼,這是為了方便我之前說的大量接受Unicode的內(nèi)部命令
 
所以我們需要確定程序使用的編碼,這是我們需要告訴程序的東西
 
  • 一方面在操作字符串的時候確定是同種編碼
  • 另一方面在使用非自己寫的命令時,一般使用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. 建議的使用習慣
 
相信到這里我已經(jīng)把我對于編碼的理解講完了。
 
我們?yōu)槭裁磿龅礁魇礁鳂拥木幋a問題:
 
  • 因為我們沒有統(tǒng)一編碼
  • 因為我們沒有用對命令(傳對數(shù)據(jù))
 
所以這里再重申一下八字真言:確定編碼,同類交互
 
  • 碰到問題,問一下自己,我現(xiàn)在是哪種編碼
  • 同一種編碼才能交互,那我應該是哪種編碼
 
這里給出我的使用習慣:
 
  • 確定一種內(nèi)部編碼
  • 內(nèi)部編碼的選擇優(yōu)先級如下:程序必須使用的編碼、第三方包使用的編碼、你喜歡的編碼、Unicode
  • 在輸出時再更改到特定的編碼
 
記得在開始整個程序之前確定內(nèi)部的編碼,否則編碼一團糟會產(chǎn)生很多不必要的bug。
 
不要迷信內(nèi)部Unicode,例如Evernote開發(fā)就應該根據(jù)第三方包使用的Utf8確定內(nèi)部編碼。


本文版權(quán)歸黑馬程序員Python培訓學院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者出處。謝謝!

作者:黑馬程序員Python培訓學院

首發(fā):http://www.pantone-color.com.cn/news/python.html


分享到:
在線咨詢 我要報名
和我們在線交談!