再說簡單點,計算機只懂二進位制數字!
所以,目的明確了:如何將我們能識別的符號唯一的與一組二進位制數字對應上?於是美利堅的同志想到通過乙個電平的高低狀態來代指0或1,
八個電平做為一組就可以表示出
256種不同狀態,每種狀態就唯一對應乙個字元,比如a--->00010001,而英文只有26個字元,算上一些特殊字元和數字,128個狀態也夠
用了;每個電平稱為乙個位元為,約定8個位元位構成乙個位元組,這樣計算機就可以用127個不同位元組來儲存英語的文字了。這就是ascii編碼。
擴充套件ansi編碼
剛才說了,最開始,乙個位元組有八位,但是最高位沒用上,預設為0;後來為了計算機也可以表示拉丁文,就將最後一位也用上了,gb2312從128到255的字符集對應拉丁文啦。至此,乙個位元組就用滿了!
計算機漂洋過海來到中國後,問題來了,計算機不認識中文,當然也沒法顯示中文;而且乙個位元組所有狀態都被佔滿了,萬惡的帝國主義亡gbk 和 gb13030我之心不死啊!我黨也是棒,自力更生,自己重寫一張表,直接生猛地將擴充套件的第八位對應拉丁文全部刪掉,規定乙個小於127的字元的意
義與原來相同,但兩個大於127的字元連在一起時,就表示乙個漢字,前面的乙個位元組(他稱之為高位元組)從0xa1用到0xf7,後面乙個位元組
(低位元組)從0xa1到0xfe,這樣我們就可以組合出大約7000多個簡體漢字了;這種漢字方案叫做 「gb2312」。gb2312 是對 ascii 的中文擴充套件。
但是漢字太多了,gb2312也不夠用,於是規定:只要第乙個位元組是大於127就固定表示這是乙個漢字的開始,不管後面跟的是不是擴充套件字符集裡的unicode編碼內容。結果擴充套件之後的編碼方案被稱為 gbk 標準,gbk 包括了 gb2312 的所有內容,同時又增加了近20000個新的漢字(包括繁體字)和符號。
很多其它國家都搞出自己的編碼標準,彼此間卻相互不支援。這就帶來了很多問題。於是,國際標誰化組織為了統一編碼:提出了標準編碼準utf8:則:unicode 。
unicode是用兩個位元組來表示為乙個字元,它總共可以組合出65535不同的字元,這足以覆蓋世界上所有符號(包括甲骨文)
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
字元編碼:python3中字串是unicode型別,unicode是萬國碼,至少32位表示乙個字元(估計有誤)---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中至少四個位元組表示乙個字元
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...