python2編碼_Python2字符編碼

webchat.jpg

我們通常見到的字符串編碼主要是三種GB2312/GBK、Unicode、UTF-8。GB2312/GBK是多字節(multibytes)編碼的一種,屬于“ASCII的加強版”,與之平行的由Big5、ShiftJIS之類的編碼各自為政,所有這些用兩個字節表示漢字的多字節編碼標準統稱為ANSI編碼,同樣的漢字在不同的ASNI編碼中的表示是不同的。為了避免這個問題,Unicode應運而生,將全世界所有的字符統一編碼到一個定長的結構中。Unicode解決了統一編碼的問題,但帶來了新的問題。第一點,Unicode和ASCII不兼容了,這是因為ASCII只有一個字節,而這一個字節肯定裝不下Unicode。第二點,用Unicode傳輸開銷變大了,這是因為很多文檔二十六個字母(1個字節)就能解決了,用Unicode多了很多冗余的字節。因此UTF-8應運而生。UTF-8對Unicode進行變長編碼(我們可以想象下Huffman樹),通常長度在1-4字節。目前Linux系統使用的是UTF-8編碼,而Windows內部則是UTF-16LE/GBK編碼。

Python2的字符串表示

Python2中有表示字符串有str和Unicode兩種。其中一個str字面量由""表示,我們也可以用''或者"""這類括號括起,一個Unicode字面量由u""括起。1

2

3

4

5

6

7

8"你好"

'xc4xe3xbaxc3'

u"你好"

u'u4f60u597d'

type("你好")

type(u"你好")

其中Unicode得益于ucs2/ucs4標準,在不同系統上都是固定的表示的。其中ucs2即Unicode16,比較常見,用2個字節(65536)來索引,一般表示是u"uxxxx",ucs4即Unicode32,一般表示是u"Uxxxxyyyy"在一些Python中也能見到。我們可以通過下面的代碼來檢測Python是哪一個1

2

3

4

5

6

7

8

9--enable-unicode=ucs4

>>> import sys

>>> print sys.maxunicode

1114111

--enable-unicode=ucs2

>>> import sys

>>> print sys.maxunicode

65535

str的表示取決于所在的系統,例如Linux是默認UTF8,上面的“你好”就會變為'/xe4/xbd/xa0/xe5/xa5/xbd',我們這里看到UTF8確實是一種字符的表示。1

2

3

4

5

6

7

8

9

10

11>>> "hello".encode("utf-8")

'hello'

>>> "hello".decode("gbk").encode("utf-8")

'hello'

>>> "你好".encode("utf-8")

Traceback (most recent call last):

File "", line 1, in

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 0: ordinal not in range(128)

>>> "你好".decode("gbk").encode("utf-8")

'xe4xbdxa0xe5xa5xbd'

Python2中字符串問題實錄

reload

在Python2中出現編碼問題時,很多人喜歡使用下面的語句來改變系統的默認編碼1

2

3import sys

(sys)

sys.setdefaultencoding('utf-8')

這種策略通常用來解決下面這樣的錯誤提示

UnicodeEncodeError: 'ascii' codec can't encode byte

現在ASCII碼不能encode是吧,那我默認都用utf-8來encode總行了吧?但這樣可能存在問題,博文中就舉出了一個實例。對于多字節字符串str,我們之前默認用ASCII解碼,要是解不開,就RE了。現在我們默認用utf-8解,utf-8閾值廣,基本都能解開,不RE了,可是就不WA了么?樣例中舉出一個例子,一個latin-1編碼的字符串,用utf-8解碼不會報錯,但解出來的結果并不對。因此在多字節編碼規則不統一這個客觀問題存在的情況下,不存在銀彈。我們需要的是用chardet.detect來猜測編碼。當猜測不出時我們只能不停地try,直到找到一個解碼不報錯的編碼,雖然可能解出來還是亂碼,因為可能一段byte串同時用utf-8、gbk、Big5等都能解碼而不報錯。

這里提供一個工具類,能夠盡可能地猜測字節串所使用的編碼1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23def ultimate_decode(doc):

def try_decode(s, try_decoding):

try:

res = s.decode(try_decoding)

return True, res

except UnicodeDecodeError:

return False, ""

if isinstance(doc, str):

predicted = chardet.detect(doc)

print predicted

if predicted['encoding'] and predicted['confidence'] > 0.5:

doc = doc.decode(predicted['encoding'])

else:

encodeing_list = ["utf-8", "gbk", "Big5", "EUC-JP"]

for e in encodeing_list:

state, res = try_decode(doc, e)

if state:

doc = res

break

if not isinstance(doc, unicode):

return None

return doc

coding

當我們在Python代碼文件中需要加入中文時,我們需要在文件開頭加上這兩行中的一行,不然即使用上前面的reload大法都不行。1

2#-*- coding:utf-8 -*-

#coding: utf8

這是用來指定Python代碼文件所使用的編碼方式。在Python2.1時,這個機制還沒有引入,我們只能通過unicode-escape的方式輸入。一個類似的做法是很多json庫dump的結果中常出現u打頭的unicode-escape字符串,這是非常正常的現象。這樣json庫可以省事地避免編碼問題,因為這樣json文件現在都是ASCII碼了。

偽裝成Unicode的多字節

有時候我們會看到這種東西u'xe3x80x8axe5',首先這外面套了個u,應該是Unicode,但是里面卻是x打頭的multi-bytes的形式,這往往是由于錯誤調用unicode()函數所致的。對此,python提供了raw_unicode_escape來解決這個問題

正則匹配

由于存在特殊符號的原因,使用正則匹配時宜使用Unicode而不是多字節匹配。但是以下的編碼在Win10和某些Linux發行版上都跑不了,但在MacOS和Ubuntu上能夠正常運行,去StackOverflow問了,他們認為這是一個Bug,所以暫時還是先用上面的方法。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/457883.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/457883.shtml
英文地址,請注明出處:http://en.pswp.cn/news/457883.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

angularJs關于指令的一些冷門屬性

我們使用ng的時候,經常會使用到指令,大家所熟知的屬性我在這里就不介紹了,講講大家沒怎么留意的屬性 1.multiElement 這是指定指令作用區間的功能,最常用的就是ng-repeat-start和ng-repeat-end了。 2.priority 指令優先級&#xf…

設備模型2

前言 在上一篇中,我們大致描述了LINUX設備模型,我們先來總結一下三要素的關系。 從圖中可以看出,Linux設備模型就是"總線、設備、驅動、類"這四個概念之前的相互關系;這也是Linux2.6內核抽象出來的用于管理系統中所有設備的模型圖; 簡單地描述…

angular自定義指令詳解

指令(directive)是angular里面最核心也是最難懂的東西,在慕課網看了下大漠窮秋老濕的視頻,自己百度半天做了一些小test,總算把一切都搞明白了。 先列出學習來源: 指令中controller和link的區別:…

delphi7aes加密解密與java互轉_跨語言(java vs python vs nodejs)的RSA加解密問題探討

多次被問到這樣的問題:java服務端的rsa加密操作已經完成,返回一個16進制的字符串給python平臺,但是在python進行私鑰解密的時候發現行不通。。。。前端python加密,后端用java解密,解不出來還有諸如nodejs從理論上來說&…

類的定義、成員定義修飾符

類的定義 修飾符含義1無或internal 只能在當前項目中訪問類,其它項目引用后也無法訪問2public 可以任何地方訪問類3abstract 不能實例化,只能供繼承之用4sealed 不能供派生之用,只能實例化5internal abstract136public abstract237intern…

設備模型3

在上一篇分析中,多次提到了SYSFS,這是個什么東西?這可是個很大的TOPIC,關于它的講述可以寫本書,但是我們暫時的目標不是要完全啃投它所有的東西,沒時間,沒精力,我們只要掌握我們需要…

浪潮之巔讀后感

這幾天看到一本非常好的書《浪潮之巔》。浪潮,指的是時代的大潮。而浪潮之巔,顧名思義就是指站在時代潮流的巔峰,引領時代潮流,扛起發展大旗。而本書就是在介紹各大處在浪潮之巔的IT公司的歷史及發展。 書中有句話說得好&#xff…

利用dft的定義計算dft的matlab程序_CP2K教程系列之靜態計算(Pymatflow篇)

本系列CP2K教程是《CP2K菜根譚》的升級版,在舊版基礎上添加了如何結合Pymatflow工具簡化計算流程的內容。話不多說,本文將為您帶來CP2K系列教程中的靜態計算部分。靜態計算設置靜態計算是大多數人接觸第一性原理計算后第一次運行的計算類型。很多其它類型…

機器學習:最大似然估計與最大后驗概率估計

在機器學習領域,概率估計是經常用到的一種模型,而概率估計中,我們經常會看到兩種估計模型,一種是最大似然估計,即 Maximum likelihood, 另外一種就是最大后驗概率估計,即 Maximum posterior &am…

ubuntu14.04安裝git

參考教程:git介紹:安裝,使用,創建分支 安裝的方法有兩種,一種直接是通過ubuntu的APT安裝,這種方法最簡便,缺點是版本可能不是最新的。所有還有另一種方法是下載源碼進行安裝,這種能…

微軟是如何戲耍程序員們的

2019獨角獸企業重金招聘Python工程師標準>>> 別用微軟的東西。商業目的性太強,千萬別被微軟牽著鼻子走,血淋淋的教訓。微軟推出的垃圾多了去了。它什么都想做,很多都沒做好: MFC:Win31時代出生,…

3d立體相冊特效html網頁代碼_新聞類網頁正文通用抽取器

項目起源開發這個項目,源自于我在知網發現了一篇關于自動化抽取新聞類網站正文的算法論文——《基于文本及符號密度的網頁正文提取方法》這篇論文中描述的算法看起來簡潔清晰,并且符合邏輯。但由于論文中只講了算法原理,并沒有具體的語言實現…

ubuntu14.04安裝 R16 Tina Linux SDK

第一步:由于是14.04系統所以這樣$sudo -i $cd /etc/apt/sources.list.d $echo "deb http://old-releases.ubuntu.com/ubuntu/ raring main restricted universe multiverse" > ia32-libs-raring.list $apt-get update $apt-get install ia32-libs $r…

分答

用戶在分答上可以自我介紹或描述擅長的領域,設置付費問答的價格,其他用戶感興趣就可以付費向其提問。分答的收入分配機制增加了信息的價值,分答中信息接收者被區分成了兩種身份。首先提問的人是一種付費懸賞模式,當回答完畢內容沉…

字節數組轉換為圖片_每日一課 | Python 3 TypeError:無法將“字節”對象隱式轉換為str...

將Python 2套接字示例轉換為Python 3whois.py import sysimport sockets socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.connect(("whois.arin.net", 43))s.send((sys.argv[1] "\r\n").encode())response ""while True: data s.re…

php版redis插件,SSDB數據庫,增強型的Redis管理api實例

php版redis插件,SSDB數據庫,增強型的Redis管理api實例 SSDB是一套基于LevelDB存儲引擎的非關系型數據庫(NOSQL),可用于取代Redis,更適合海量數據的存儲。另外,rocksdb是FB在LevelDB的二次開發版本,因此也存…

加速度計和陀螺儀數據融合

本帖翻譯自 IMU(加速度計和陀螺儀設備)在嵌入式應用中使用的指南。這篇文章主要介紹加速度計和陀螺儀的數學模型和基本算法,以及如何融合這兩者,側重算法、思想的討論介紹本指南旨在向興趣者介紹慣性MEMS(微機電系統&a…

循環嵌套練習題

//BOSS://讓用戶輸入一個奇數,打印菱形,最長的行內容個數為用戶輸入的個數,并且由英文字母拼接而成//比如用戶輸入了7// A// ABA// ABCBA// ABCDCBA// ABCBA// ABA// A//1、接收并判斷用戶輸入的是不是數字 try{#region 解法一…

python leetcode_leetcode 介紹和 python 數據結構與算法學習資料

for (剛入門的編程)的高中 or 大學生leetcode 介紹leetcode 可以說是 cs 最核心的一門“課程”了,雖然不是大學開設的,但基本上每一個現代的高水平的程序員都修過這門“課程”(或者類似的課程,比如數據結構…

平衡小車卡爾曼濾波算法

最近研究STM32的自平衡小車,發現有兩座必過的大山,一為卡爾曼濾波,二為PID算法。 網上看了很多關于卡爾曼濾波的代碼,感覺寫得真不咋地。一怒之下,自己重寫,不廢話,貼代碼 [pre lang"C&quo…