python與編碼

Python的誕生時間比Unicode要早很多,所以早期Python版本的默認編碼是ASCII,現在python2依然默認是ASCII編碼,而python3默認是utf-8。

因爲Python的誕生比Unicode標準發佈的時間還要早,所以最早的Python只支持ASCII編碼,普通的字符串’ABC’在Python內部都是ASCII編碼的。Python提供了ord()和chr()函數,可以把字母和對應的數字相互轉換:

>>>ord('A')
65
>>>chr(65)
A

Python在後來添加了對Unicode的支持,以Unicode表示的
字符串用 u’…’表示,python默認是unicode表示的字符串,所以通常不寫u。
python3中str字符串類型在內存中存的是Unicode數據,bytes類型字符串存儲的是bytes數據。如下:

name0 = 'abc'
name1 = b'abc'
name2 = '二剛'
name3 =u'二剛'
print(type(name0))
print(type(name1))
print(type(name2))
print(type(name3))
print(repr(name0))
print(repr(name1))
print(repr(name2))
print(repr(name3))

運行結果:

<class 'str'>
<class 'bytes'>
<class 'str'>
<class 'str'>
'abc'
b'abc'
'二剛'
'二剛'

u’中’u’\u4e2d’是一樣的,\u後面是十六進制的Unicode
碼。又如,u’A’u’\u0041’也是一樣的。
這裏寫圖片描述

把u’xxx’轉換爲UTF-8編碼的’xxx’用encode(‘utf-8’)方法,即編碼例如:

>>>u'ABC'.encode('utf-8')
b'ABC'

>>>u'中文'.encode('utf-8')
b'\xe4\xb8\xad\xe6\x96\x87'

>>>len(u'ABC')
3

>>>len(b'ABC')
3

>>>len(u'中文')
2

>>>len('\xe4\xb8\xad\xe6\x96\x87')
6

英文字符轉換後表示的UTF-8的值和Unicode值相等(但佔用的存儲空間不同),而中文字符轉換後1個Unicode字符將變爲3個UTF-8字符,你看到的\xe4就是其中一個字節,因爲它的值是 228,沒有對應的字母可以顯示,所以以十六 進制顯示字節的數值。len()函數可以返回字符串的長度.

**反過來,把UTF-8編碼表示的字符串’xxx’轉換爲Unicode字符串
u’xxx’用decode(‘utf-8’)方法,即解碼**例如:

>>>b'abc'.decode('utf-8')
'abc'

>>>b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
'中文'u'\u4e2d\u6587'

由於Python源代碼也是一個文本文件,所以,當你的源代碼中包含中文的時候,在保存源代碼時,就需要務必指定保存爲UTF-8編碼。當Python解釋器讀取源代碼時,爲了讓它按UTF-8編碼讀取,我們通常在文件開頭寫上這兩行:

#!/usr/bin/env python# -*- coding: utf-8 -*-

第一行註釋是爲了告訴Linux/OS X系統,這是一個Python可執行程序,Windows系統會忽略這個註釋;
第二行註釋是爲了告訴Python解釋器,按照UTF-8編碼讀取源代碼,否則,你在源代碼中寫的中文輸出可能會有亂碼。

簡單的總結一下編碼bytes數據是爲了方便傳輸與存儲,而Unicode數據方便了顯示

發佈了32 篇原創文章 · 獲贊 30 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章