亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Python編碼

系統(tǒng) 1626 0

1.內(nèi)存和硬盤都是用來(lái)存儲(chǔ)的。

內(nèi)存:速度快

硬盤:永久保存

Python編碼_第1張圖片

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

   打開(kāi)編輯器就可以啟動(dòng)一個(gè)進(jìn)程,是在內(nèi)存中的,所以在編輯器編寫的內(nèi)容也都是存放在內(nèi)存中的,斷電后數(shù)據(jù)就丟失了。因而需要保存在硬盤上,點(diǎn)擊保存按鈕或快捷鍵,就把內(nèi)存中的數(shù)據(jù)保存到了硬盤上。在這一點(diǎn)上,我們編寫的py文件(沒(méi)有執(zhí)行時(shí)),跟編寫的其他文件沒(méi)有什么區(qū)別,都只是編寫一堆字符而已。

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

  第一階段:python解釋器啟動(dòng),此時(shí)就相當(dāng)于啟動(dòng)了一個(gè)文本編輯器

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

  第三階段:python解釋器執(zhí)行剛剛加載到內(nèi)存中的test.py的代碼(在該階段,即執(zhí)行時(shí),才會(huì)識(shí)別python的語(yǔ)法,執(zhí)行到字符串時(shí),會(huì)開(kāi)辟內(nèi)存空間存放字符串)

總結(jié):python解釋器與文本編輯器的異同

相同點(diǎn):python解釋器是解釋執(zhí)行文件內(nèi)容的,因而python解釋器具備讀py文件的功能,這一點(diǎn)與文本編輯器一樣

不同點(diǎn):文本編輯器將文件內(nèi)容讀入內(nèi)存后,是為了顯示/編輯,而python解釋器將文件內(nèi)容讀入內(nèi)存后,是為了執(zhí)行(識(shí)別python的語(yǔ)法)

4.什么是編碼?

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

  這就必須經(jīng)過(guò)一個(gè)過(guò)程:

    字符---------(翻譯過(guò)程)-------------數(shù)字

  這個(gè)過(guò)程實(shí)際就是一個(gè)字符如何對(duì)應(yīng)一個(gè)特定數(shù)字的標(biāo)準(zhǔn),這個(gè)標(biāo)準(zhǔn)稱之為字符編碼。

5.以下兩個(gè)場(chǎng)景涉及到字符編碼的問(wèn)題:

  1.一個(gè)python文件中的內(nèi)容是由一堆字符組成的(python文件未執(zhí)行時(shí))

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

6.字符編碼的發(fā)展史

階段一:現(xiàn)代計(jì)算機(jī)起源于美國(guó),最早誕生也是基于英文考慮的ASCII

   ASCII:一個(gè)Bytes代表一個(gè)字符(英文字符/鍵盤上的所有其他字符),1Bytes=8bit,8bit可以表示0-2**8-1種變化,即可以表示256個(gè)字符

    ASCII最初只用了后七位,127個(gè)數(shù)字,已經(jīng)完全能夠代表鍵盤上所有的字符了(英文字符/鍵盤的所有其他字符)

    后來(lái)為了將拉丁文也編碼進(jìn)了ASCII表,將最高位也占用了

階段二:為了滿足中文,中國(guó)人定制了GBK

  GBK:2Bytes代表一個(gè)字符,為了滿足其他國(guó)家,各個(gè)國(guó)家紛紛定制了自己的編碼,日本把日文編到 Shift_JIS 里,韓國(guó)把韓文編到 Euc-kr

階段三:各國(guó)有各國(guó)的標(biāo)準(zhǔn),就會(huì)不可避免地出現(xiàn)沖突,結(jié)果就是,在多語(yǔ)言混合的文本中,顯示出來(lái)會(huì)有亂碼。

于是產(chǎn)生了unicode,統(tǒng)一用 2Bytes 代表一個(gè)字符,2**16-1=65535,可代表6萬(wàn)多個(gè)字符,因而兼容萬(wàn)國(guó)語(yǔ)言

但對(duì)于通篇都是英文的文本來(lái)說(shuō),這種編碼方式無(wú)疑是多了一倍的存儲(chǔ)空間(二進(jìn)制最終都是以電或者磁的方式存儲(chǔ)到存儲(chǔ)介質(zhì)中的)

于是產(chǎn)生了UTF-8,對(duì)英文字符只用1Bytes表示,對(duì)中文字符用3Bytes

需要強(qiáng)調(diào)的是:

unicode: 簡(jiǎn)單粗暴,多有的字符都是2Bytes,優(yōu)點(diǎn)是字符--數(shù)字的轉(zhuǎn)換速度快;缺點(diǎn)是占用空間大。

utf-8: 精準(zhǔn),可變長(zhǎng),優(yōu)點(diǎn)是節(jié)省空間;缺點(diǎn)是轉(zhuǎn)換速度慢,因?yàn)槊看无D(zhuǎn)換都需要計(jì)算出需要多長(zhǎng)Bytes才能夠準(zhǔn)確表示。

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

2.硬盤中或網(wǎng)絡(luò)傳輸用utf-8,保證數(shù)據(jù)傳輸?shù)姆€(wěn)定性。

          
            1 所有程序,最終都要加載到內(nèi)存,程序保存到硬盤不同的國(guó)家用不同的編碼格式,但是到內(nèi)存中我們?yōu)榱思嫒萑f(wàn)國(guó)(計(jì)算機(jī)可以運(yùn)行任何國(guó)家的程序原因在于此),統(tǒng)一且固定使用unicode, 
2 這就是為何內(nèi)存固定用unicode的原因,你可能會(huì)說(shuō)兼容萬(wàn)國(guó)我可以用utf-8啊,可以,完全可以正常工作,之所以不用肯定是unicode比utf-8更高效啊(uicode固定用2個(gè)字節(jié)編碼
3 ,utf-8則需要計(jì)算),但是unicode更浪費(fèi)空間,沒(méi)錯(cuò),這就是用空間換時(shí)間的一種做法,而存放到硬盤,或者網(wǎng)絡(luò)傳輸,都需要把unicode轉(zhuǎn)成utf-8, 
4 因?yàn)閿?shù)據(jù)的傳輸,追求的是穩(wěn)定,高效,數(shù)據(jù)量越小數(shù)據(jù)傳輸就越靠譜,于是都轉(zhuǎn)成utf-8格式的,而不是unicode。
          
        

七、字符編碼轉(zhuǎn)換

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

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

Python編碼_第2張圖片

文件從內(nèi)存刷到硬盤的操作簡(jiǎn)稱存文件

文件從硬盤讀到內(nèi)存的操作簡(jiǎn)稱讀文件

亂碼:存文件時(shí)就已經(jīng)亂碼 或者 存文件時(shí)不亂碼而讀文件時(shí)亂碼

總結(jié):

無(wú)論是何種編輯器,要防止文件出現(xiàn)亂碼(請(qǐng)一定注意,存放一段代碼的文件也僅僅只是一個(gè)普通文件而已,此處指的是文件沒(méi)有執(zhí)行前,我們打開(kāi)文件時(shí)出現(xiàn)的亂碼)

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

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

文件test.py以gbk格式保存,內(nèi)容為:

  x='林'

無(wú)論是

  python2 test.py

還是

  python3 test.py

都會(huì)報(bào)錯(cuò)(因?yàn)閜ython2默認(rèn)ascii,python3默認(rèn)utf-8)

除非在文件開(kāi)頭指定#coding:gbk

九、程序的執(zhí)行

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

階段一:?jiǎn)?dòng)python解釋器

階段二:python解釋器此時(shí)就是一個(gè)文本編輯器,負(fù)責(zé)打開(kāi)文件test.py,即從硬盤中讀取test.py的內(nèi)容到內(nèi)存中

此時(shí),python解釋器會(huì)讀取test.py 的第一行內(nèi)容,#coding :utf-8,來(lái)決定以什么編碼格式來(lái)讀入內(nèi)存,這一行就是來(lái)設(shè)定python解釋器這個(gè)軟件的編碼使用的編碼格式這個(gè)編碼,python2默認(rèn)使用ASCII,python3中默認(rèn)使用utf-8

階段三:讀取已經(jīng)加載到內(nèi)存的代碼(unicode編碼的二進(jìn)制),然后執(zhí)行,執(zhí)行過(guò)程中可能會(huì)開(kāi)辟新的內(nèi)存空間,比如x="egon"

內(nèi)存的編碼使用unicode,不代表內(nèi)存中全都是unicode編碼的二進(jìn)制,

在程序執(zhí)行之前,內(nèi)存中確實(shí)都是unicode編碼的二進(jìn)制,比如從文件中讀取了一行x="egon",其中的x,等號(hào),引號(hào),地位都一樣,都是普通字符而已,都是以u(píng)nicode編碼的二進(jìn)制形式存放與內(nèi)存中的

但是程序在執(zhí)行過(guò)程中,會(huì)申請(qǐng)內(nèi)存(與程序代碼所存在的內(nèi)存是倆個(gè)空間),可以存放任意編碼格式的數(shù)據(jù),比如x="egon",會(huì)被python解釋器識(shí)別為字符串,會(huì)申請(qǐng)內(nèi)存空間來(lái)存放"hello",然后讓x指向該內(nèi)存地址,此時(shí)新申請(qǐng)的該內(nèi)存地址保存也是unicode編碼的egon,如果代碼換成x="egon".encode('utf-8'),那么新申請(qǐng)的內(nèi)存空間里存放的就是utf-8編碼的字符串egon了

十、python2與python3的區(qū)別

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

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

          
            #coding:utf-8
s='林' #在執(zhí)行時(shí),'林'會(huì)被以conding:utf-8的形式保存到新的內(nèi)存空間中

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

s.decode('utf-8') # '\u006796' 兩個(gè)Bytes,證實(shí)為unicode,16進(jìn)制形式,轉(zhuǎn)換為二進(jìn)制為1100111 10010111
# s.encode('utf-8') #報(bào)錯(cuò),s為編碼后的結(jié)果bytes,所以只能decode
            
          
        

  當(dāng)python解釋器執(zhí)行到產(chǎn)生字符串的代碼時(shí)(例如s=u'林'),會(huì)申請(qǐng)新的內(nèi)存地址,然后將'林'以u(píng)nicode的格式存放到新的內(nèi)存空間中,所以s只能encode,不能decode

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

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

對(duì)于unicode格式的數(shù)據(jù)來(lái)說(shuō),無(wú)論怎么打印,都不會(huì)亂碼

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

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

          
            #coding:utf-8
s='林' #當(dāng)程序執(zhí)行時(shí),無(wú)需加u,'林'也會(huì)被以u(píng)nicode形式保存新的內(nèi)存空間中,

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

print(type(s)) #
            
          
        

字符編碼總結(jié):

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

  內(nèi)存固定使用unicode編碼,

  我們可以控制的編碼是往硬盤存放或者基于網(wǎng)絡(luò)傳輸選擇編碼。

2.數(shù)據(jù)是最先產(chǎn)生于內(nèi)存中,是unicode格式,要想傳輸需要轉(zhuǎn)成bytes格式

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

拿到bytes,就可以往文件內(nèi)存存放或者基于網(wǎng)絡(luò)傳輸

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

3.python3中字符串被識(shí)別成unicode

python3中的字符串encode得到bytes

4.了解

  python2中的字符串就是bytes

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

5.任何程序的運(yùn)行都需要加載到內(nèi)存中

Python 標(biāo)準(zhǔn)數(shù)據(jù)類型:Bytes

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

Bytes 對(duì)象只負(fù)責(zé)以二進(jìn)制字節(jié)序列的形式記錄所需記錄的對(duì)象,至于該對(duì)象到底表示什么(比如到底是什么字符)則由相應(yīng)的編碼格式解碼所決定。我們可以通過(guò)調(diào)用 bytes() 類(沒(méi)錯(cuò),它是類,不是函數(shù))生成 bytes 實(shí)例,其值形式為 b'xxxxx',其中 'xxxxx' 為一至多個(gè)轉(zhuǎn)義的 十六進(jìn)制 字符串(單個(gè) x 的形式為:\xHH,其中 \x 為小寫的十六進(jìn)制轉(zhuǎn)義字符,HH 為二位十六進(jìn)制數(shù))組成的序列,每個(gè)十六進(jìn)制數(shù)代表一個(gè)字節(jié)(八位二進(jìn)制數(shù),取值范圍 0-255),對(duì)于同一個(gè)字符串如果采用不同的編碼方式生成 bytes 對(duì)象,就會(huì)形成不同的值:

Python編碼_第3張圖片

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

clipboard.png

另外,對(duì)于 ASCII 字符串,可以直接使用 b'xxxx' 賦值創(chuàng)建 bytes 實(shí)例,但對(duì)于非 ASCII 編碼的字符則不能通過(guò)這種方式創(chuàng)建 bytes 實(shí)例:

Python編碼_第4張圖片

由于 bytes 是序列,因此我們可以通過(guò)索引或切片訪問(wèn)它的元素:

Python編碼_第5張圖片

可以發(fā)現(xiàn)如果以單個(gè)索引的形式訪問(wèn)元素,其會(huì)直接返回單個(gè)字節(jié)的十進(jìn)制整數(shù),而以序列片段的形式訪問(wèn)時(shí),則返回相應(yīng)的十六進(jìn)制字符序列。

對(duì)于 bytes 實(shí)例,如果需要還原成相應(yīng)的字符串,則需要借助內(nèi)置的解碼函數(shù) decode(),借助相應(yīng)的編碼格式解碼為正常字符串對(duì)象,如果采用錯(cuò)誤的編碼格式解碼,則有可能發(fā)生錯(cuò)誤:

Python編碼_第6張圖片


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

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

【本文對(duì)您有幫助就好】

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

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 久久精品视频在线播放 | 国产不卡在线看 | 成人a毛片免费全部播放 | 欧美大片日韩精品四虎影视 | 天天干夜夜怕 | 婷婷色在线视频 | 国内精品区一区二区三 | 在线观看深夜观看网站免费 | 久久九九影视 | 日韩伦理一区二区三区 | 四虎影视免费永久在线观看黄 | 国产真实伦偷精品 | 久久99热精品免费观看 | 香蕉视频97 | 97午夜影院 | 国产精品视频视频久久 | 国产精品人人 | 中国免费毛片 | 国产精品18久久久久久久久久 | 亚洲精品中文字幕一区 | 四虎影院最新入口 | 美女被羞羞产奶视频网站 | 日本一级毛片 | 久久网站免费 | 日本欧美一区二区三区在线观看 | 狠狠色噜噜狠狠狠米奇9999 | 在线综合 亚洲 欧美中文字幕 | 久久久久久久尹人综合网亚洲 | 五月伊人网 | 色老头在线观看精品 | 国产精品综合 | 高清不卡一区二区 | 福利色姬网站视频入口 | 天天做爽夜夜做爽 | 4虎最新| 久操伊人| 色人阁在线| 91香蕉黄 | 香香影院在线观看 | 久草视频播放 | 国产区综合 |