python 字元編碼

2022-02-20 13:02:44 字數 3481 閱讀 9047

再說簡單點,計算機只懂二進位制數字!

所以,目的明確了:如何將我們能識別的符號唯一的與一組二進位制數字對應上?於是美利堅的同志想到通過乙個電平的高低狀態來代指0或1,

八個電平做為一組就可以表示出

256種不同狀態,每種狀態就唯一對應乙個字元,比如a--->00010001,而英文只有26個字元,算上一些特殊字元和數字,128個狀態也夠

用了;每個電平稱為乙個位元為,約定8個位元位構成乙個位元組,這樣計算機就可以用127個不同位元組來儲存英語的文字了。這就是ascii編碼。  

擴充套件ansi編碼 

剛才說了,最開始,乙個位元組有八位,但是最高位沒用上,預設為0;後來為了計算機也可以表示拉丁文,就將最後一位也用上了,

從128到255的字符集對應拉丁文啦。至此,乙個位元組就用滿了!

gb2312

計算機漂洋過海來到中國後,問題來了,計算機不認識中文,當然也沒法顯示中文;而且乙個位元組所有狀態都被佔滿了,萬惡的帝國主義亡

我之心不死啊!我黨也是棒,自力更生,自己重寫一張表,直接生猛地將擴充套件的第八位對應拉丁文全部刪掉,規定乙個小於127的字元的意

義與原來相同,但兩個大於127的字元連在一起時,就表示乙個漢字,前面的乙個位元組(他稱之為高位元組)從0xa1用到0xf7,後面乙個位元組

(低位元組)從0xa1到0xfe,這樣我們就可以組合出大約7000多個簡體漢字了;這種漢字方案叫做 「gb2312」。gb2312 是對 ascii 的中文擴充套件。

gbk 和 gb13030

但是漢字太多了,gb2312也不夠用,於是規定:只要第乙個位元組是大於127就固定表示這是乙個漢字的開始,不管後面跟的是不是擴充套件字符集裡的

內容。結果擴充套件之後的編碼方案被稱為 gbk 標準,gbk 包括了 gb2312 的所有內容,同時又增加了近20000個新的漢字(包括繁體字)和符號。

unicode編碼 

很多其它國家都搞出自己的編碼標準,彼此間卻相互不支援。這就帶來了很多問題。於是,國際標誰化組織為了統一編碼:提出了標準編碼準

則:unicode 。

unicode是用兩個位元組來表示為乙個字元,它總共可以組合出65535不同的字元,這足以覆蓋世界上所有符號(包括甲骨文)

utf8:

unicode都一統天下了,為什麼還要有乙個utf8的編碼呢?

大家想,對於英文世界的人們來講,乙個位元組完全夠了,比如要儲存a,本來00010001就可以了,現在吃上了unicode的大鍋飯,

得用兩個位元組:00000000 00010001才行,浪費太嚴重!

基於此,美利堅的科學家們提出了天才的想法:utf8.

utf-8(8-bit unicode transformation format)是一種針對unicode的可變長度字元編碼,它可以使用1~4個位元組表示乙個符號,根據

不同的符號而變化位元組長度,當字元在ascii碼的範圍時,就用乙個位元組表示,所以是相容ascii編碼的。

這樣顯著的好處是,雖然在我們記憶體中的資料都是unicode,但當資料要儲存到磁碟或者用於網路傳輸時,直接使用unicode就遠不如utf8省空間啦!

這也是為什麼utf8是我們的推薦編碼方式。

unicode與utf8的關係:

一言以蔽之:unicode是記憶體編碼表示方案(是規範),而utf是如何儲存和傳輸unicode的方案(是實現)這也是utf與unicode的區別。

str型別 ----------->位元組編碼後的二進位制資料       

字串型別

unicode型別-------->unicode編碼後的二進位制資料

s1='苑'

print type(s1) # print repr(s1) #'\xe8\x8b\x91

s2=u'苑'

print type(s2) # print repr(s2) # u'\u82d1'

s1=u'苑'

print repr(s1) #u'\u82d1'

b=s1.encode('utf8')

print b

print type(b) #print repr(b) #'\xe8\x8b\x91'

s2='苑昊'

u=s2.decode('utf8')

print u # 苑昊

print type(u) # print repr(u) # u'\u82d1\u660a'

#注意u2=s2.decode('gbk')

print u2 #鑻戞槉

print len('苑昊') #6

str型別 ---------->unicode編碼後的二進位制資料       

字串型別

bytes型別-------->bytes編碼後的二進位制資料

import json

s='苑昊'

print(type(s)) #print(json.dumps(s)) # "\u82d1\u660a"

b=s.encode('utf8')

print(type(b)) # print(b) # b'\xe8\x8b\x91\xe6\x98\x8a'

u=b.decode('utf8')

print(type(u)) #print(u) #苑昊

print(json.dumps(u)) #"\u82d1\u660a"

print(len('苑昊')) # 2

字元編碼:

---utf8存入硬碟-------

#coding:utf8

print("壞小子")

---------------------

方式一:在pycharm執行 setting都是utf8

python 3 不亂碼

python 2 不亂碼

方式二:在cmd執行

python 3 不亂碼 直譯器按utf8解碼,翻譯為uniode在執行,cmd執行print("壞小子")時,字串為unicode資料

python 2 亂碼 直譯器按utf8解碼,翻譯為bytes在執行,cmd應該把"壞小子"列印為bytes資料,而不是明文

但python2直譯器會進行乙個暗轉換,把"壞小子" bytes資料解碼轉換為unicode資料,

cmd按gbk將bytes資料解碼為unicode時,會出錯。

python3中字串是unicode型別,unicode是萬國碼,至少32位表示乙個字元(估計有誤)

python3中至少四個位元組表示乙個字元

python字元編碼

ascii 碼是乙個位元組,通常只能顯示英文本母和數字。unicode碼為了顯示多種語言產生,但是要占用兩個位元組,顯示文字要占用大量空間 utf 8 為了節約空間而生,英文本元只用乙個位元組儲存,中文字元需要三個位元組 character ascii unicode utf 8 a01000000...

python字元編碼

列印python檔案編碼 import sys print sys.getdefaultencoding 中文的乙個字元unicode占用2個位元組。對在於ascii字元占用1個位元組 utf 8中 中文字元佔3個位元組,英文本元占用1個位元組 編碼和轉碼 unicode不能再解碼了 它是基層的 u...

Python字元編碼

在用python程式設計中,字串有兩種表示方法 string 和 u string 為什麼字串要是用這兩種表達方式。不是僅僅用前一種呢?使用type 函式檢視,它們各自是str物件和unicode物件。這兩個物件有什麼差別嗎?還有經經常使用到的encode 和decode 又是幹什麼的呢?都說pyt...