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不新增直接報錯py3中只有2中資料型別,bytes和unicode, 而且str中儲存的是unicode,bytes中儲存的是bytespython3中預設是utf-8,中文占用3個位元組 【gbk中文占用2個位元組】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)
python 3最重要的新特性大概要算是對文字[unicode]和二進位制資料[bytes]作了更為清晰的區分。文字總是unicode,由str型別表示,二進位制資料則由bytes型別表示。
python 3 中對 unicode 支援的最大變化就是將會沒有對 byte 位元組串的自動解碼。如果你想要用乙個 byte 位元組串和乙個 unicode 相鏈結的話,你將會得到乙個錯誤,不管你包含的內容是什麼。
所有這些在 python 2 中都將會有隱式的處理,而在 python 3 中你將會得到乙個錯誤。
python3中大量的使用了迭代器,避免了資料一次性全部載入到記憶體中。
s = '中國' # s裡面存的unicodeb1 = 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問:py2中為什麼要新增conding:utf-8才可以列印漢字?utf-8是誰看呢?s = '中國'
print(repr(s)) # py2: repr可以直接檢視
print(json.dumps(s)) # py3: \u4e2d\u56fd
答:給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者可以相互轉換,其他的轉換需要中間轉
1
bytes
-
-
>
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...