1. 程式人生 > >python unicode 編碼整理

python unicode 編碼整理

unicode 是 character set

  • character set 是把每個字元對應成數字的集合,比如unicode中 A對應0041,漢字『我』對應 ‘6211’
  • unicode 是個很大的集合,幾乎覆蓋世界上所有的字元,現在的規模已經可以容納100萬個字元。

utf-8 是對 unicode 儲存的實現方式

unicode 只定義字元對應的數字,但沒有規定這些數字如何儲存起來,比如像中文的『我』字儲存時需要兩個位元組來表示,而英文字母A卻只需要一個位元組,有些其他的字元可能需要3-4個位元組。

  • 如果統一規定每個字元用3個或者4個位元組來儲存,那麼每個英文字元都必然需要額外2到3個0,這對儲存是很大的浪費。
  • 如果每個字元按照實際需要的位元組數來儲存,計算機就分不清三個位元組是表示三個字元還是一個字元。

utf-8 是對 unicode 編碼儲存的一種實現方式,同樣的還有 utf-16, utf-32。

utf-8 是使用最廣泛的編碼方式,採用變長的編碼方式,可以使用1-4個位元組來表示一個字元; utf-16 用2個或4個位元組,utf-32 用4個位元組表示。編碼規則如下:

  1. 對於單位元組的符號,位元組的第一位設為0,後面7位為這個符號的unicode碼。因此對於英語字母, UTF-8編碼和ASCII碼是相同的。
  2. 對於n位元組的符號(n>1),第一個位元組的前n位都設為1,第n+1位設為0,後面位元組的前兩位一律設為10。剩下的沒有提及的二進位制位,全部為這個符號的unicode碼。

python2 中的 str 和 unicode

python2 中有字串型別有兩種:byte string (str)unicode string (unicode)

Python
123456789 >>>s='美的'>>>s'\xe7\xbe\x8e\xe7\x9a\x84'>>>s=u'美的'>>>su'\u7f8e\u7684'>>>s='美的'>>>s.decode('utf-8')u'\u7f8e\u7684'

上面的輸出中,第一個s的型別是 str,打印出來的內容是 utf-8 編碼過的內容。第二個s的型別是 unicode,打印出來的兩個雙位元組的數字分別表示了兩個漢字『美的』。

encodedecode提供 str 和 unicode 這兩種的型別的互相轉化。

  • encode 把 unicode 轉化成 str(byte string)
  • decode 把 str(byte string) 轉化成 unicode

本質上,str是存放的位元組序,有可能是 ascii, gbk, utf-8 等等中的任意一種,通過呼叫 decode 可以把他們轉化成 unicode ,預設的 decode 編碼是 ascii 。str中到底是用的哪一種編碼,取決於它所在的場景,跟 locale ,檔案編碼等等都有關係。

文字檔案、編輯器的處理

123456 #!/usr/bin/env python# -*- coding: GBK -*-s=u'中文'print repr(s)print repr(s.encode('GBK'))

比如上面的檔案enc.py,儲存的時候選擇檔案編碼是GBK,程式檔案本質上也是檔案,當我們使用某個外部的應用 開啟它時(編輯器或者python直譯器等),外部應用是不知道該檔案的編碼格式的,

這個時候有三種情況:

  • 應用使用其預設的編碼方式去解析,比如UTF-8或者ASCII;python直譯器預設是ASCII,編輯器可以自己設定;
  • 應用根據檔案中的位元組內容,自動檢測編碼方式;
  • 文字檔案告訴應用使用什麼編碼方式去解碼;比如# -*- coding: GBK -*-告知直譯器使用GBK來解碼;

試驗一下,把# -*- coding: GBK -*-刪除後,執行python enc.py,輸出:

Python
12 File"enc.py",line4SyntaxError:Non-ASCII character'\xd6'infileenc.py on line4,but no encoding declared;

試著用vim開啟該檔案時,『中文』兩個字就會顯示成亂碼,因為vim預設的檔案編碼方式被設定成UTF-8了。

123456789101112 #!/usr/bin/env python# -*- coding: GBK -*-s1=u'中文'print repr(s1)print repr(s1.encode('GBK'))s2='中文'print repr(s2)print repr(s2.decode('GBK'))

輸出結果:

Python
1234 u'\u4e2d\u6587''\xd6\xd0\xce\xc4''\xd6\xd0\xce\xc4'u'\u4e2d\u6587'

從這裡可以看出來, s2中存放的是byte格式的從檔案中讀到的GBK編碼的內容。

再看下面的這段程式碼,程式檔案utf8_enc.py,儲存成UTF-8編碼的。

123456789101112 #!/usr/bin/env python# -*- coding: utf-8 -*-s1=u'中文'print repr(s1)print repr(s1.encode('GBK'))s2='中文'print repr(s2)print repr(s2.decode('GBK'))

輸出:

Python
1234567 u'\u4e2d\u6587''\xd6\xd0\xce\xc4''\xe4\xb8\xad\xe6\x96\x87'Traceback(most recent call last):File"unicode_enc.py",line12,in<module>printrepr(s2.decode('GBK'))UnicodeDecodeError:'gbk'codec can'tdecode bytes inposition2-3:illegal multibyte sequence

這裡同樣可以知道,s2中存放的是檔案儲存的編碼UTF-8的byte碼。

References

相關推薦

python unicode 編碼整理

unicode 是 character set character set 是把每個字元對應成數字的集合,比如unicode中 A對應0041,漢字『我』對應 ‘6211’ unicode 是個很大的集合,幾乎覆蓋世界上所有的字元,現在的規模已經可以容納100萬個字元。 utf-8 是對 unicode

Python Unicode編碼方式

方式 -- logs unicode cnblogs sdn 文獻 article col 編譯時使用--enable-unicode=ucs4 >>> import sys >>> print sys.maxunicode 111

Python Unicode編碼

其中 它的 pick 不能 encode 如果 兼容 type text 使用技巧事實上,只要遵守以下規則,可以規避90%由於Unicode字符串處理引起的bug,剩下的10%通過python的庫和模塊能夠解決。程序中出現字符串時一定要加個前綴u。不要用str()函數,用u

Python中的Unicode編碼和UTF-8編碼

2個 傳輸 硬盤 中文字符 結合 2.7 客戶端 有一點 來看 下午看廖雪峰的Python2.7教程,看到 字符串和編碼 一節,有一點感受,結合 崔慶才的Python博客 ,把這種感受記錄下來: ASCII碼:是用一個字節(8bit, 0-255)中的127個字母表示大

python連接mysql插入Unicode編碼數據,‘‘被轉義

col pro ins img 處理 ima ces image pla value=‘\u4e2d\u6587‘sql=‘INSERT INTO base.a (a.id,a.name) VALUES (‘1‘,value)‘sql.execute(sql) 數據庫中查

python中的字符串編碼問題——2.理解ASCII碼、ANSI碼、Unicode編碼、UTF-8編碼

unicode編碼 統一 col 簡單 utf 文字 stand 二進制 pan ASCII碼:全名是American Standard Code for Information Interchange,ASCII碼中,一個英文字母(不分大小寫)占一個字節的空間,範圍0x0

Python解決unicode編碼,如\xe9\x9d\x92\xe8\x9b\x99\xe7\x8e\x8b\xe5\xad\x90轉中文

裡的方法:     s = '\xe9\x9d\x92\xe8\x9b\x99\xe7\x8e\x8b\xe5\xad\x90'     ss = s.encode('raw_unicode_es

python 中文unicode編碼

一、 excel中寫入中文報錯UnicodeDecodeError : ‘ascii’ codec can’t decode byte 0xe5 in position 0: ordinal not in range(128) 1.向excel中追加內容 解決方法: 第一

有關 Python 2 和 Sublime Text 中文 Unicode 編碼問題的分析與理解

問題背景: 相信很多用 Sublime Text 來寫 Python 2 的同學都遇到過以下這個問題(例如這位同學 /t/100435 和這位同學 /t/163012 ): 在 Sublime Text 裡用 Cmd (Ctrl) + B 執行程式碼 print u'中文',想要打印出 unicode 型

Python將'\u'開頭的字串轉為unicode編碼

web資訊中常會遇到“\u4f60\u597d”型別的字元。首先’\u‘開頭就基本表明是跟unicode編碼相關的,“\u”後的16進位制字串是相應漢字的utf-16編碼。Python裡decode()和encode()為我們提供瞭解碼和編碼的方法。其中decode('unicode_escape')能將此

python unicode 及解碼編碼方式簡介

python及編碼原理測試 基於utf—8環境。 #coding:utf-8 unicode為通用編碼。 coding:utf-8的作用是宣告python直譯器及str的編碼方式,並不改變其他sys.getdefaultencoding()的預設編碼

Python 讀取檔案中unicode編碼轉成中文顯示問題

Python讀取檔案中的字串已經是unicode編碼,如:\u53eb\u6211,需要轉換成中文時有兩種方式 1.使用eval eval("u"+"\'"+unicodestr+"\'") 2.使用decode: str1 = '\u4f60\u

Pythonunicode編碼的字串和其他格式的字串之間進行轉換

1.1. 問題 Problem You need to deal with data that doesn't fit in the ASCII character set. 你需要處理不適合用ASCII字符集表示的資料. 1.2. 解決 Solution

python編碼轉換 unicode, utf-8, utf-16, GBK

GB 碼,全稱是GB2312-80《資訊交換用漢字編碼字符集基本集》,1980年釋出,是中文資訊處理的國家標準,在大陸及海外使用簡體中文的地區(如新加坡等)是強制使用的唯一中文編碼。P- Windows3.2和蘋果OS就是以GB2312為基本漢字編碼, Windows 95/98則以GBK為基本漢字編碼

python學習之unicode編碼

python內建的字串有兩種型別:str和Unicode,它們擁有共同的祖先basestring。 Unicode也稱做萬國碼,它為每種語言設定了唯一的二進位制編碼表示方式,提供從數字程式碼到不同語言字符集之間的對映,從而可以滿足跨平臺、誇語言之間的文字處理要求。

python之分析decode、encode、unicode編碼轉換為漢字

decode()方法使用註冊編碼的編解碼器的字串進行解碼。它預設為預設的字串編碼。decode函式可以將一個普通字串轉換為unicode物件。decode是將普通字串按照引數中的編碼格式進行解析,然後生成對應的unicode物件,比如在這裡我們程式碼用的是utf-8,那麼把

python 字元編碼與解碼——unicode、str和中文:UnicodeDecodeError: 'ascii' codec can't decode

摘要:在進行python指令碼的編寫時,如果我們用python來處理網頁資料或者進行與中文字元有關的處理工作,經常出現這樣的出錯資訊:SyntaxError: Non-ASCII character '\xe6' in file ./filename.py on line

python讀取unicode編碼txt檔案

之前用kindle匯出的txt檔案是unicode編碼的,想要自己寫個小程式來自行格式化,然而怎麼讀都是亂碼。像這樣: 一開始沒有找到辦法只好把txt檔案另存為ansi格式,順利格式化了。 但是,為什麼會讀取成這樣呢? 最後一直查辦法終於找到了這個東西:chardet 匯入它以後使用

使用python將用ASCII表示的16進位制unicode編碼的ASCII字串轉換為unicode字串

漢字“你”的unicode編碼為u'/u4F60',將該編碼用ASCII字元表示為字串“4F60”。按照這樣的規則將一字串編碼後,如何還原為unicode字串?可以通過使用兩個Python內建的函式來簡單解決這個問題。    int( [x [, radix] ]) —— 該

python函式——編碼問題——str與Unicode的區別

一篇關於STR和UNICODE的好文章 整理下python編碼相關的內容 注意: 以下討論為Python2.x版本, Py3k的待嘗試 開始 用python處理中文時,讀取檔案或訊息,http引數等等,一執行,發現亂碼(字串處理,讀寫檔案,print),然後,大多