1、了解字元編碼的知識儲備。編輯器和終端中所有顯示的內容都屬於記憶體,記憶體使用的unicode
開啟編輯器就開啟了啟動了乙個程序,是在記憶體中的,所以在編輯器編寫的內容也都是存放與記憶體中的,斷電後資料丟失
因而需要儲存到硬碟上,點選儲存按鈕,就從記憶體中把資料刷到了硬碟上。
在這一點上,我們編寫乙個py檔案(沒有執行),跟編寫其他檔案沒有任何區別,都只是在編寫一堆字元而已。
2、字元編碼,將字元轉化為數字的功過稱之為編碼
階段一:現代計算機起源於美國,最早誕生也是基於英文考慮的ascii
ascii:乙個bytes代表乙個字元(英文本元/鍵盤上的所有其他字元),1bytes=8bit,8bit可以表示0-2**8-1種變化,即可以表示256個字元
ascii最初只用了後七位,127個數字,已經完全能夠代表鍵盤上所有的字元了(英文本元/鍵盤的所有其他字元)
後來為了將拉丁文也編碼進了ascii表,將最高位也占用了
階段二:為了滿足中文,中國人定製了gbk
gbk:2bytes代表乙個字元
為了滿足其他國家,各個國家紛紛定製了自己的編碼
日本把日文編到shift_jis
裡,南韓把韓文編到euc-kr
裡
階段三:各國有各國的標準,就會不可避免地出現衝突,結果就是,在多語言混合的文字中,顯示出來會有亂碼。
於是產生了unicode, 統一用2bytes代表乙個字元, 2**16-1=65535,可代表6萬多個字元,因而相容萬國語言
但對於通篇都是英文的文字來說,這種編碼方式無疑是多了一倍的儲存空間(二進位制最終都是以電或者磁的方式儲存到儲存介質中的)
於是產生了utf-8,對英文本元只用1bytes表示,對中文字元用3bytes
需要強調的一點是:
unicode:簡單粗暴,所有字元都是2bytes,優點是字元->數字的轉換速度快,缺點是占用空間大
utf-8:精準,對不同的字元用不同的長度表示,優點是節省空間,缺點是:字元->數字的轉換速度慢,因為每次都需要計算出字元需要多長的bytes才能夠準確表示
記憶體中使用的編碼是unicode,用空間換時間(程式都需要載入到記憶體才能執行,因而記憶體應該是盡可能的保證快)
硬碟中或者網路傳輸用utf-8,網路i/o延遲或磁碟i/o延遲要遠大與utf-8的轉換延遲,而且i/o應該是盡可能地節省頻寬,保證資料傳輸的穩定性。
無論是何種編輯器,要防止檔案出現亂碼3、執行程式核心法則就是,檔案以什麼編碼儲存的,就以什麼編碼方式開啟
而檔案編碼儲存時候使用的編碼方式是右下角的編碼方式,而解碼的時候是使用文件開頭申明的編碼方式,兩種編碼不同的時候很容易出現亂碼的情況。
python test.py (我再強調一遍,執行test.py的第一步,一定是先將檔案內容讀入到記憶體中)
階段一:啟動python直譯器
此時,python直譯器會讀取test.py的第一行內容,#coding:utf-8,來決定以什麼編碼格式來讀入記憶體,這一行就是來設定python直譯器這個軟體的編碼使用的編碼格式這個編碼,
可以用sys.getdefaultencoding()檢視,如果不在python檔案指定頭資訊#-*-coding:utf-8-*-,那就使用預設的
python2中預設使用ascii,python3中預設使用utf-8
階段三:讀取已經載入到記憶體的**(unicode編碼的二進位制),然後執行,執行過程中可能會開闢新的記憶體空間,比如x="egon"
記憶體的編碼使用unicode,不代表記憶體中全都是unicode編碼的二進位制,
在程式執行之前,記憶體中確實都是unicode編碼的二進位制,比如從檔案中讀取了一行x="egon",其中的x,等號,引號,地位都一樣,都是普通字元而已,都是以unicode編碼的二進位制形式存放與記憶體中的
但是程式在執行過程中,會申請記憶體(與程式**所存在的記憶體是倆個空間),可以存放任意編碼格式的資料,比如x="egon",會被python直譯器識別為字串,會申請記憶體空間來存放"hello",然後讓x指向該記憶體位址,此時新申請的該記憶體位址儲存也是unicode編碼的egon,如果**換成x="egon".encode('utf-8'),那麼新申請的記憶體空間裡存放的就是utf-8編碼的字串egon了
針對python3如下圖
瀏覽網頁的時候,伺服器會把動態生成的unicode內容轉換為utf-8再傳輸到瀏覽器
如果服務端encode的編碼格式是utf-8, 客戶端記憶體中收到的也是utf-8編碼的二進位制。
4、python2與python3的區別
python3 str型別 和bytes
#python2 str型別 和bytesauthor : xiajinqi
#_*_ coding:utf8 _*_
#python3 中預設以uncode
str1 = '
劉亦菲'
#python3 當程式執行時,無需加u,'林'也會被以unicode形式儲存新的記憶體空間中,
str2= u'
劉亦菲'
(type(str1),type(str2))
print(str1,str2) #
程式執行時候,str1,str2申請以unicode格式編碼儲存在記憶體空間張,列印終端也屬於記憶體。相當於從記憶體到記憶體,只是空間不同而已,編碼一直。因此永遠不會亂碼,並且不可以decode
str3 =str1.encode('
utf-8
') #
字串以utf8編碼轉化為位元組型別,儲存在記憶體空間
str4 =str1.encode('
gbk') #
字串以utf8編碼轉化為位元組型別,儲存在記憶體空間
print(str3,str4) #
e:\users\xiajinqi\pycharmprojects\twoday\venv\scripts\python.exe e:/users/xiajinqi/pycharmprojects/twoday/coding.py
'str
'>
'str
'>劉亦菲 劉亦菲b'
\xe5\x88\x98\xe4\xba\xa6\xe8\x8f\xb2
' b'
\xc1\xf5\xd2\xe0\xb7\xc6
'process finished with exit code 0
str1 = '總結:python3 和python2中的變數u都是以uncode編碼。因此無能如何列印,終端不會出現亂碼(因為終端是屬於記憶體,因此也是用uncode)。劉亦菲' #python3 當程式執行時,'林'
也會被以python檔案開頭指定的字元編碼進行編碼形式儲存新的記憶體空間中,因此只能decode 與python存在很大差異
str2= u'
劉亦菲'
##coding:utf-8
s=u'
林' #當程式執行時,'林'
會被以unicode形式儲存新的記憶體空間中
#s指向的是unicode,因而可以編碼成任意格式,都不會報encode錯誤
s1=s.encode('
utf-8')
s2=s.encode('
gbk'
)print s1 #列印正常否?
print s2 #列印正常否
print repr(s) #u
'\u6797
'print repr(s1) #
'\xe6\x9e\x97
' 編碼乙個漢字utf-8用3bytes
print repr(s2) #
'\xc1\xd6
'編碼乙個漢字gbk用2bytes
print type(s) #
'unicode
'>print type(s1) #
'str
'>print type(s2) #
'str
'>
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...