Python學習 深入編碼學習1225

2022-07-03 14:54:17 字數 3889 閱讀 8619

py2中只有2中資料型別,str和unicode,而且str中儲存的是bytes,unicode中儲存的是unicode

一切我們能看到的明文都是unicode資料型別, bytes是計算機識別 的內容

py2特點:

py2是ascii編碼,只能將ascii裡面的字元做轉換,其他的會報錯

嚴格意義上說,str其實是位元組串, unicode是乙個字串,str是unicode這個字串經過編碼(utf8,gbk等)後的位元組組成的序列。

unicode才是真正意義上的字串

py2編碼的最大特點是python 2 將會自動的將bytes資料解碼成 unicode 字串,不區分str和unicode

所以在2裡我們可以將位元組與字串拼接, 對位元組串str使用正確的字元編碼進行解碼後獲得,並且len(u'苑') == 1

# coding:utf-8            # py2不新增直接報錯

print '我是誰' # 一切我們能看到的明文都是unicode資料型別[utf-8 ->unicode -> unicode]

# bytes = str

print '我是jackie' # str 型別記憶體中是bytes

print repr('我是jackie') #'\xe6\x88\x91\xe6\x98\xafjackie' 乙個漢字等於3個位元組

print type('我是jackie') # print u'我是jackie' # 我是jackie

print type(u'我是jackie') # print 'hello' + u'world' # world是unicode編碼,但列印成功,因為print裡面做了處理,將『hello'的byte型別轉換為了unicode

# print (u'我是'+'誰') # 因為中文的unicode無法做ascii轉換,所以報錯,需要手動解碼 # unicodedecodeerror: 'ascii' codec can't decode byte 0xe6

# in position 0: ordinal not in range(128)

py3中只有2中資料型別,bytes和unicode, 而且str中儲存的是unicode,bytes中儲存的是bytespython3中預設是utf-8,中文占用3個位元組 【gbk中文占用2個位元組】

python 3最重要的新特性大概要算是對文字[unicode]和二進位制資料[bytes]作了更為清晰的區分。文字總是unicode,由str型別表示,二進位制資料則由bytes型別表示。

python 3 中對 unicode 支援的最大變化就是將會沒有對 byte 位元組串的自動解碼。如果你想要用乙個 byte 位元組串和乙個 unicode 相鏈結的話,你將會得到乙個錯誤,不管你包含的內容是什麼。

所有這些在 python 2 中都將會有隱式的處理,而在 python 3 中你將會得到乙個錯誤。

python3中大量的使用了迭代器,避免了資料一次性全部載入到記憶體中。

s = '中國'                  # s裡面存的unicode

b1 = s.encode('utf-8')

print(b1, type(b1)) # b'\xe4\xb8\xad\xe5\x9b\xbd' print(b1.decode('utf-8')) # 中國 decode的是unicode,但是print顯示的是明文,中間系統轉換了結果

# print(b1.decode('gbk')) # unicodedecodeerror: 'gbk' codec can't decode byte 0xad

# 列印的時候因為個數對應不上,所以報錯了

檢視中文字元的unicode編碼:

import json

s = '中國'

print(repr(s)) # py2: repr可以直接檢視

print(json.dumps(s)) # py3: \u4e2d\u56fd

問:py2中為什麼要新增conding:utf-8才可以列印漢字?utf-8是誰看呢?

答:給python2的直譯器看,因為py2的預設編碼是ascii,不能識別中文,所以需要宣告編碼方式

問:py2中檔案在磁碟中的編碼是什麼?

idea有自己的儲存格式,所以根idea有關,直譯器解釋的時候是根據我們儲存的檔案格式去解釋的,儲存的和解釋的要一致了才能執行解釋。

問:py2在執行的時候的內容跟磁碟的內容是否一樣呢?

答: 轉換編碼後是一致的,磁碟儲存的為計算機識別的二進位制檔案

問:python檔案編碼的時候是utf-8為什麼剛才我們又說字串在記憶體中是unicode編碼呢?

答:unicode是萬國碼,不同的系統編碼不同,所以python直譯器幫我們解釋為unicode後加入記憶體,這個時候就不用擔心系統直譯器解釋不了【py2和py3一樣】

問:py2和py3中print的區別?

答:在python 2中,print是乙個語句(statement);而在python 3中變成了函式(function)。

問:大概的流程是什麼?

答:作業系統基於utf_8儲存的文字   --> 讀取進入記憶體中[utf-8]  --> 直譯器轉換我們儲存的資料為unicode編碼[我們儲存的資料到此都是unicode]  --> 交給cpu去執行[此時cpu將我們要列印的內容進行了轉換

ascii: 將二進位制翻譯成我們能看懂的字元,共計255個符號,所有字元占用8個位元1個位元組

支援中文的第一張表就叫 gb2312

unicode 萬國碼  支援所有國家和地區的編碼且向下相容gb2312 , gbk

2**16 = 65535 = 存乙個字元 統一占用2個位元組

utf-8 = unicode 的擴充套件集,可變長的字元編碼集

assic -->gb2312 ->gbk1.0-->gb18030

assic -->unicode -->utf-8(支援所有國家語言,支援中文)   /utf-16

py3中只有2種資料型別:str[unicode編碼]  bytes[十六進製制編碼], 2者可以相互轉換,其他的轉換需要中間轉

1bytes-->int:int(str(bytes('123','utf-8'),'utf-8'))# 編碼

py3中合併py2中的int和long int型別為int型別

python學習 編碼

為了將各種不同的語言都包括在同一的字符集中,滿足國際間的資訊交流國際上制定了unicode字符集。通過使用unicode字符集能夠滿足跨語言的文書處理,有效的避免亂碼產生。用法 在指令碼中新增下面 行之中的乙個 coding utf 8 coding utf 8 注意 假設是在命令列輸出中文,則須要...

C 開始前篇,深入編譯鏈結(補充1)

針對這些問題,這次做乙個補充 一,可重定位檔案的格式是什麼,以main.o為例,格式為elf 包括 1,elf header 它描述了整個檔案的檔案屬性,包括檔案是否可以執行,是靜態鏈結還是動態鏈結及入口位址 若是可執行 檔案 目標硬體,目標作業系統等等。2,text 段 按四位元組對齊 一般c語言...

DNS深入學習 1

主要貢獻者包括 micha k pie jan piet mens,andrew babichev,jacob hoffman andrews,peter van dijk,nathan froyd,gene mcculley,charles henri bruyand,jose nazario,w...