關(guān)于python編碼督暂,你真的明白了嗎

計(jì)算機(jī)存儲(chǔ)的幾個(gè)概念

想要徹底搞清楚編碼問(wèn)題,我們必須要先搞清楚計(jì)算機(jī)是怎么存儲(chǔ)數(shù)據(jù)的皇拣,這就涉及到了計(jì)算機(jī)基礎(chǔ)的幾個(gè)概念了严蓖,開(kāi)篇我們就先來(lái)捋捋這幾個(gè)容易混淆的概念。

bit

二進(jìn)制位审磁, 是計(jì)算機(jī)內(nèi)部數(shù)據(jù)儲(chǔ)存的最小單位谈飒,11010100是一個(gè)8位二進(jìn)制數(shù)。一個(gè)二進(jìn)制位只可以表示0和1兩種狀態(tài)(21)态蒂;兩個(gè)二進(jìn)制位可以表示00杭措、01、10钾恢、11四種(22)狀態(tài)手素;三位二進(jìn)制數(shù)可表示八種狀態(tài)(2^3)……

Byte

字節(jié),是計(jì)算機(jī)中數(shù)據(jù)處理的基本單位瘩蚪,計(jì)算機(jī)中以字節(jié)為單位存儲(chǔ)和解釋信息泉懦,規(guī)定一個(gè)字節(jié)由八個(gè)二進(jìn)制位構(gòu)成,即1個(gè)字節(jié)等于8個(gè)比特(1Byte=8bit)疹瘦。八位二進(jìn)制數(shù)最小為00000000崩哩,最大為11111111;通常1個(gè)字節(jié)可以存入一個(gè)ASCII碼言沐,2個(gè)字節(jié)可以存放一個(gè)漢字國(guó)標(biāo)碼邓嘹。

在計(jì)算機(jī)中,一串?dāng)?shù)碼作為一個(gè)整體來(lái)處理或運(yùn)算的险胰,稱(chēng)為一個(gè)計(jì)算機(jī)字汹押,簡(jiǎn)稱(chēng)宇。字通常分為若干個(gè)字節(jié)(每個(gè)字節(jié)一般是8位)起便。在存儲(chǔ)器中棚贾,通常每個(gè)單元存儲(chǔ)一個(gè)字,因此每個(gè)字都是可以尋址的榆综。字的長(zhǎng)度用位數(shù)來(lái)表示妙痹。在計(jì)算機(jī)的運(yùn)算器鼻疮、控制器中,通常都是以字為單位進(jìn)行傳送的陋守。

字長(zhǎng)

字長(zhǎng):電腦技術(shù)中對(duì)CPU在單位時(shí)間內(nèi)(同一時(shí)間)能一次處理的二進(jìn)制數(shù)的位數(shù)叫字長(zhǎng)利赋。所以能處理字長(zhǎng)為8位數(shù)據(jù)的CPU通常就叫8位的CPU。同理32位的CPU就能在單位時(shí)間內(nèi)處理字長(zhǎng)為32位的二進(jìn)制數(shù)據(jù)猩系。

字節(jié)和字長(zhǎng)的區(qū)別:由于常用的英文字符用8位二進(jìn)制就可以表示媚送,所以通常就將8位稱(chēng)為一個(gè)字節(jié)寇甸。字長(zhǎng)的長(zhǎng)度是不固定的,對(duì)于不同的CPU拿霉、字長(zhǎng)的長(zhǎng)度也不一樣吟秩。8位的CPU一次只能處理一個(gè)字節(jié),而32位的CPU一次就能處理4個(gè)字節(jié)绽淘,同理字長(zhǎng)為64位的CPU一次可以處理8個(gè)字節(jié)涵防。

常見(jiàn)的編碼

ASCII: 1個(gè)字節(jié)沪铭,只編碼英文字母和符號(hào)

gb2312: 2個(gè)字節(jié),增加了中文漢字和符號(hào)

Unicode: 把所有語(yǔ)言都統(tǒng)一到一套編碼里把所有語(yǔ)言都統(tǒng)一到一套編碼里杀怠,
一般是2個(gè)字節(jié),生僻字4個(gè)字節(jié)

utf-8: 可變長(zhǎng)編碼橙依,常用的英文字母被編碼成1個(gè)字節(jié)硕旗,漢字通常是3個(gè)字節(jié)窗骑,只有很生僻的字符才會(huì)被編碼成4-6個(gè)字節(jié)卵渴。如果你要傳輸?shù)奈谋景罅坑⑽淖址鹬瘢肬TF-8編碼就能節(jié)省空間:

在計(jì)算機(jī)內(nèi)存中,統(tǒng)一使用Unicode編碼碘橘,當(dāng)需要保存到硬盤(pán)或者需要傳輸?shù)臅r(shí)候吱肌,就轉(zhuǎn)換為UTF-8編碼痘拆,這樣可以節(jié)省很多存儲(chǔ)空間氮墨。

Python編碼

注:這里討論的是python2.7的情況

兩個(gè)函數(shù)

在python中吐葵,str和unicode都是basestring的子類(lèi)桥氏,basestring有以下兩個(gè)方法:

encode(): 將unicode字符串轉(zhuǎn)換為其他編碼字符串,參數(shù)為轉(zhuǎn)換后編碼

decode(): 將其他編碼轉(zhuǎn)換為unicode字符串凤藏,參數(shù)為轉(zhuǎn)換前編碼

PS:"string".decode('utf-8') == unicode('string', 'utf-8')

一個(gè)栗子

s = '中文'
print type(s), len(s)

u = u'中文'
print type(u), len(u)

u2s = u'中文'.encode('utf-8')
print type(u2s), len(u2s)

結(jié)果是這樣的

<type 'str'> 6
<type 'unicode'> 2
<type 'str'> 6

console下查看u2s

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

結(jié)論:

  • python中定義的一個(gè)str變量實(shí)則是字節(jié)串,由Unicode經(jīng)過(guò)編碼(encode)后的字節(jié)組成的(
    也正好印證了utf8編碼中一個(gè)中文字符是3個(gè)字節(jié))
  • Unicode才是真正意義上的字符串揖庄,由字符組成

再次回顧兩個(gè)函數(shù)用法

s = '中文'
# 這時(shí)是str欠雌,轉(zhuǎn)為unicode需要用decode
u = s.decode('utf-8')
print type(u)
# 打印 <type 'unicode'>

# unicode轉(zhuǎn)為str ,使用encode
s2 = u.encode('utf-8')
print type(s2)
# 打印 <type 'str'>

新結(jié)論:不同編碼轉(zhuǎn)換,使用Unicode作為中間編碼

#s是code_A的str
s.decode('code_A').encode('code_B')

在Python 3.x版本中,把'xxx'u'xxx'已經(jīng)都統(tǒng)一成Unicode編碼了桨昙,即寫(xiě)不寫(xiě)前綴u都是一樣的,而以字節(jié)形式表示的字符串則必須加上b前綴:b'xxx'齐苛。

由于Python源代碼也是一個(gè)文本文件桂塞,所以,當(dāng)你的源代碼中包含中文的時(shí)候阁危,在保存源代碼時(shí),就需要?jiǎng)?wù)必指定保存為UTF-8編碼擂煞。當(dāng)Python解釋器讀取源代碼時(shí)趴乡,為了讓它按UTF-8編碼讀取,我們通常在文件開(kāi)頭寫(xiě)上這兩行:

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

參考

字節(jié)晾捏、字、位劳秋、比特,這四者之間的關(guān)系
廖雪峰:python2.7教程之字符串和編碼
PYTHON-進(jìn)階-編碼處理小結(jié)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嗽冒,一起剝皮案震驚了整個(gè)濱河市岁忘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌干像,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件速客,死亡現(xiàn)場(chǎng)離奇詭異五鲫,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)位喂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)塑崖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人规婆,你說(shuō)我怎么就攤上這事【虮桑” “怎么了嗡髓?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)饿这。 經(jīng)常有香客問(wèn)我,道長(zhǎng)吧黄,這世上最難降的妖魔是什么唆姐? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任奉芦,我火速辦了婚禮,結(jié)果婚禮上伸蚯,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布黍特。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,764評(píng)論 1 290
  • 那天舔箭,我揣著相機(jī)與錄音烙荷,去河邊找鬼拿诸。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的泞遗。 我是一名探鬼主播席覆,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼佩伤,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了生巡?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤甸陌,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后邀层,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體遂庄,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡涛目,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了霹肝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡臭蚁,死狀恐怖讯赏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情漱挎,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布私爷,位于F島的核電站膊夹,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏放刨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一拓诸、第九天 我趴在偏房一處隱蔽的房頂上張望麻昼。 院中可真熱鬧,春花似錦抚芦、人聲如沸迈螟。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)洗搂。三九已至载弄,卻和暖如春耘拇,著一層夾襖步出監(jiān)牢的瞬間宇攻,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工嘉涌, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留夸浅,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓词身,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親法严。 傳聞我的和親對(duì)象是個(gè)殘疾皇子葫笼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容