欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Python編碼

系統 1720 0

1.內存和硬盤都是用來存儲的。

內存:速度快

硬盤:永久保存

Python編碼_第1張圖片

2.文本編輯器存取文件的原理(nodepad++,pycharm,word)

   打開編輯器就可以啟動一個進程,是在內存中的,所以在編輯器編寫的內容也都是存放在內存中的,斷電后數據就丟失了。因而需要保存在硬盤上,點擊保存按鈕或快捷鍵,就把內存中的數據保存到了硬盤上。在這一點上,我們編寫的py文件(沒有執行時),跟編寫的其他文件沒有什么區別,都只是編寫一堆字符而已。

3.python解釋器執行py文件的原理,例如python test.py

  第一階段:python解釋器啟動,此時就相當于啟動了一個文本編輯器

  第二階段:python解釋器相當于文本編輯器,去打開test.py,從硬盤上將test.py的文件內容讀入到內存中

  第三階段:python解釋器執行剛剛加載到內存中的test.py的代碼(在該階段,即執行時,才會識別python的語法,執行到字符串時,會開辟內存空間存放字符串)

總結:python解釋器與文本編輯器的異同

相同點:python解釋器是解釋執行文件內容的,因而python解釋器具備讀py文件的功能,這一點與文本編輯器一樣

不同點:文本編輯器將文件內容讀入內存后,是為了顯示/編輯,而python解釋器將文件內容讀入內存后,是為了執行(識別python的語法)

4.什么是編碼?

  計算機想要工作必須通電,高低電平(高電平即二進制數1,低電平即二進制數0),也就是說計算機只認識數字。那么讓計算機如何讀懂人類的字符呢?

  這就必須經過一個過程:

    字符---------(翻譯過程)-------------數字

  這個過程實際就是一個字符如何對應一個特定數字的標準,這個標準稱之為字符編碼。

5.以下兩個場景涉及到字符編碼的問題:

  1.一個python文件中的內容是由一堆字符組成的(python文件未執行時)

  2.python中的數據類型字符串是由一串字符組成的(python文件執行時)

6.字符編碼的發展史

階段一:現代計算機起源于美國,最早誕生也是基于英文考慮的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才能夠準確表示。

1.內存中使用的編碼是unicode,用空間換時間(程序都需要加載到內存才能運行,因而內存應該是越快越好)

2.硬盤中或網絡傳輸用utf-8,保證數據傳輸的穩定性。

          
            1 所有程序,最終都要加載到內存,程序保存到硬盤不同的國家用不同的編碼格式,但是到內存中我們為了兼容萬國(計算機可以運行任何國家的程序原因在于此),統一且固定使用unicode, 
2 這就是為何內存固定用unicode的原因,你可能會說兼容萬國我可以用utf-8啊,可以,完全可以正常工作,之所以不用肯定是unicode比utf-8更高效啊(uicode固定用2個字節編碼
3 ,utf-8則需要計算),但是unicode更浪費空間,沒錯,這就是用空間換時間的一種做法,而存放到硬盤,或者網絡傳輸,都需要把unicode轉成utf-8, 
4 因為數據的傳輸,追求的是穩定,高效,數據量越小數據傳輸就越靠譜,于是都轉成utf-8格式的,而不是unicode。
          
        

七、字符編碼轉換

unicode------>encode(編碼)-------->utf-8

utf-8---------->decode--------->unicode

Python編碼_第2張圖片

文件從內存刷到硬盤的操作簡稱存文件

文件從硬盤讀到內存的操作簡稱讀文件

亂碼:存文件時就已經亂碼 或者 存文件時不亂碼而讀文件時亂碼

總結:

無論是何種編輯器,要防止文件出現亂碼(請一定注意,存放一段代碼的文件也僅僅只是一個普通文件而已,此處指的是文件沒有執行前,我們打開文件時出現的亂碼)

核心法則就是,文件以什么編碼保存的,就以什么編碼方式打開

八、 文本編輯器之python解釋器

文件test.py以gbk格式保存,內容為:

  x='林'

無論是

  python2 test.py

還是

  python3 test.py

都會報錯(因為python2默認ascii,python3默認utf-8)

除非在文件開頭指定#coding:gbk

九、程序的執行

python3 test.py 或 python2 test.py(執行test.py的第一步,一定是先將文件內容讀入到內存中)

階段一:啟動python解釋器

階段二:python解釋器此時就是一個文本編輯器,負責打開文件test.py,即從硬盤中讀取test.py的內容到內存中

此時,python解釋器會讀取test.py 的第一行內容,#coding :utf-8,來決定以什么編碼格式來讀入內存,這一行就是來設定python解釋器這個軟件的編碼使用的編碼格式這個編碼,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了

十、python2與python3的區別

在python2中有兩種字符串類型str和unicode

  在python2中,str就是編碼后的結果bytes,所以在Python2中,unicode字符編碼的結果就是str/bytes

          
            #coding:utf-8
s='林' #在執行時,'林'會被以conding:utf-8的形式保存到新的內存空間中

print repr(s) #'\xe6\x9e\x97' 三個Bytes,證明確實是utf-8,16進制形式,轉換為二進制為11100110 10011110 10010111
print type(s) #
            
              

s.decode('utf-8') # '\u006796' 兩個Bytes,證實為unicode,16進制形式,轉換為二進制為1100111 10010111
# s.encode('utf-8') #報錯,s為編碼后的結果bytes,所以只能decode
            
          
        

  當python解釋器執行到產生字符串的代碼時(例如s=u'林'),會申請新的內存地址,然后將'林'以unicode的格式存放到新的內存空間中,所以s只能encode,不能decode

          
            s=u'林'
print repr(s) #u'\u6797'
print type(s) #
            
              

# s.decode('utf-8') #報錯,s為unicode,所以只能encode
s.encode('utf-8')
            
          
        

對于unicode格式的數據來說,無論怎么打印,都不會亂碼

python3中的字符串與python2中的u'字符串',都是unicode,所以無論如何打印都不會亂碼

在python3中也有兩種字符串類型str和bytes
  str是unicode

          
            #coding:utf-8
s='林' #當程序執行時,無需加u,'林'也會被以unicode形式保存新的內存空間中,

#s可以直接encode成任意編碼格式
s.encode('utf-8')
s.encode('gbk')

print(type(s)) #
            
          
        

字符編碼總結:

1.以什么編碼存的就以什么編碼取出

  內存固定使用unicode編碼,

  我們可以控制的編碼是往硬盤存放或者基于網絡傳輸選擇編碼。

2.數據是最先產生于內存中,是unicode格式,要想傳輸需要轉成bytes格式

#unicode------>encode (utf-8)-------->bytes

拿到bytes,就可以往文件內存存放或者基于網絡傳輸

#bytes------>decode (utf-8)-------->unicode

3.python3中字符串被識別成unicode

python3中的字符串encode得到bytes

4.了解

  python2中的字符串就是bytes

  python2中的字符串前面加u,就是unicode

5.任何程序的運行都需要加載到內存中

Python 標準數據類型:Bytes

Bytes 對象是由單個字節作為基本元素(8位,取值范圍 0-255)組成的序列,為不可變對象。

Bytes 對象只負責以二進制字節序列的形式記錄所需記錄的對象,至于該對象到底表示什么(比如到底是什么字符)則由相應的編碼格式解碼所決定。我們可以通過調用 bytes() 類(沒錯,它是類,不是函數)生成 bytes 實例,其值形式為 b'xxxxx',其中 'xxxxx' 為一至多個轉義的 十六進制 字符串(單個 x 的形式為:\xHH,其中 \x 為小寫的十六進制轉義字符,HH 為二位十六進制數)組成的序列,每個十六進制數代表一個字節(八位二進制數,取值范圍 0-255),對于同一個字符串如果采用不同的編碼方式生成 bytes 對象,就會形成不同的值:

Python編碼_第3張圖片

比如上例中的 a 字符串對象,其十進制 unicode 值為 24464,分別使用 'utf-8' 和 'gb2312' 兩種編碼格式將其轉換成 bytes 對象 b 和 c ,結果 b 和 c 的值是完全不同的,由于基于的編碼格式不一致, b c 長度甚至都不相同,前者有 3 個字節長度,后者有 2 個字節長度:

clipboard.png

另外,對于 ASCII 字符串,可以直接使用 b'xxxx' 賦值創建 bytes 實例,但對于非 ASCII 編碼的字符則不能通過這種方式創建 bytes 實例:

Python編碼_第4張圖片

由于 bytes 是序列,因此我們可以通過索引或切片訪問它的元素:

Python編碼_第5張圖片

可以發現如果以單個索引的形式訪問元素,其會直接返回單個字節的十進制整數,而以序列片段的形式訪問時,則返回相應的十六進制字符序列。

對于 bytes 實例,如果需要還原成相應的字符串,則需要借助內置的解碼函數 decode(),借助相應的編碼格式解碼為正常字符串對象,如果采用錯誤的編碼格式解碼,則有可能發生錯誤:

Python編碼_第6張圖片


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 无码又黄又爽又舒服的A片 综合久久网 | 无码人妻精品1国产婷婷 | 国产精品夜色一区二区三区 | 黄在线观看+在线播放 | 国产精品视频 | 天天操天天添 | 国产福利不卡视频在免费播放 | 国产精品久久久久影院色老大 | 精品无人乱码一区二区三区 | 多女多p多杂交视频在线观看 | 超碰97最新 | 性欧美一区 | a极毛片| 人人欧美 | 精品毛片视频 | 亚洲午夜久久久久中文字幕久 | 免费国产视频在线观看 | 一区二区三区四区电影 | 亚洲国产精品久久久 | 亚洲在线播放视频 | 精品国产不卡一区二区三区 | 成人免费福利 | 色www精品视频在线观看 | 一区二区三区在线 | 日本 | 99黄色网| 欧美影院| 国产极品福利视频在线观看 | 欧美激情 亚洲 | 日韩欧美国产精品第一页不卡 | 欧美国产精品久久 | 国产一区二区精品 | 五月婷婷在线播放 | 欧美日韩一区二区三 | 欧美午夜精品久久久久免费视 | 日韩一区二区三区视频 | 久久久久久久99精品免费观看 | 在线中文字幕亚洲 | 亚洲精品久久久一区二区三区 | 亚洲欧美日韩精品一区 | 韩漫重考生漫画画免费读漫画下拉式土豪漫 | 国产精品无码人妻无码色情多人 |