小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

第四章 python3 語(yǔ)法基礎(chǔ)之字符集編碼格式

 靜幻堂 2018-09-13
Kevin的事情 2018-09-09 15:25:13

題目說(shuō)是python3的語(yǔ)法基礎(chǔ),但我這里不介紹最基礎(chǔ)的語(yǔ)法規(guī)則,主要介紹背后的原理和技巧輔助大家理解和使用python3。

這一篇介紹Python3的字符編碼格式。

Python3初學(xué)者編碼實(shí)踐中經(jīng)常遇到encode error,decode error,如下:

例1:

UnicodeEncodeError: 'ascii' codec can't encode character u'\u5728' in position 1

例2:

UnicodeDecodeError: 'utf-8' codec can't decode bytes in position 0-1: invalid continuation byte

1、百度的時(shí)候,大家都建議在代碼文件頭加上字符集定義:

# -*- coding: utf-8 -*-

這種方法大部分情況下可以解決大部分的問(wèn)題。那么它解決的是什么問(wèn)題呢?

我們需要理解兩個(gè)概念:

1)、# -*- coding: utf-8 -*- 的作用是聲明 python源代碼文件的編碼格式。 誰(shuí)會(huì)讀取Python的源代碼呢? 一個(gè)是IDE編輯工具,比如pycharm,nodpad++,editpluss等,我們?cè)趯?xiě)代碼的時(shí)候使用。2)、另一個(gè)是Python解釋器,是執(zhí)行Python程序的時(shí)候使用。

當(dāng)我們使用IDE編輯器打開(kāi)Python代碼的時(shí)候,如果出現(xiàn)亂碼,我們都知道是編輯器的解碼方式和代碼文件的編碼方式不一致導(dǎo)致的。需要修改編輯器的解碼方式。

那么Python解釋執(zhí)行Python程序的時(shí)候使用的是設(shè)么解碼方式呢?可以用下面的方式查看:

sys.getdefaultencoding()

可以用下面的方式修改:

reload(sys)

sys.setdefaultencoding('utf-8')

sys.getdefaultencoding()

所以,代碼文件第一行加 字符集定義,解決Python解釋器讀取Python代碼文件時(shí)的字符集識(shí)別問(wèn)題

2、在print的時(shí)候出現(xiàn)異常,或者寫(xiě)文件,或者解析網(wǎng)絡(luò)報(bào)文,或者做str對(duì)象處理的時(shí)候出現(xiàn)亂碼。

這個(gè)時(shí)候我們需要理解:

1)、文件讀寫(xiě)、網(wǎng)絡(luò)報(bào)文讀寫(xiě)都可以理解為IO讀寫(xiě)。是byte處理,所以讀寫(xiě)前后需要使用同樣的字符編碼方式。

2)、print、str對(duì)象的處理涉及到終端的編碼格式。print之后,在pycharm的輸出窗口,或者windows的CMD命令行窗口,或者Linux的shell窗口,需要適配終端的編碼方式

3)、字符編碼基本可分為三大類(lèi):起源于美國(guó)的ASCII,支持英文字符、數(shù)字、標(biāo)點(diǎn)符號(hào)、鍵盤(pán)上的特殊字符;國(guó)際編碼unicode,支持ascII的字符集外,又支持中文,韓語(yǔ),日語(yǔ)等。因?yàn)閡nicode占用空間大,所以又出現(xiàn)了utf-8。需要強(qiáng)調(diào)的一點(diǎn)是

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

utf-8:精準(zhǔn),對(duì)不同的字符用不同的長(zhǎng)度表示,優(yōu)點(diǎn)是節(jié)省空間,缺點(diǎn)是:字符->數(shù)字的轉(zhuǎn)換速度慢,因?yàn)槊看味夹枰?jì)算出字符需要多長(zhǎng)的Bytes才能夠準(zhǔn)確表示

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

2.硬盤(pán)中或者網(wǎng)絡(luò)傳輸用utf-8,網(wǎng)絡(luò)I/O延遲或磁盤(pán)I/O延遲要遠(yuǎn)大與utf-8的轉(zhuǎn)換延遲,而且I/O應(yīng)該是盡可能地節(jié)省帶寬,保證數(shù)據(jù)傳輸?shù)姆€(wěn)定性。

下面詳細(xì)介紹了unicode和utf-8的使用場(chǎng)景:

在程序執(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)存放"egon",然后讓x指向該內(nèi)存地址,此時(shí)新申請(qǐng)的該內(nèi)存地址保存也是unicode編碼的egon,如果代碼換成x="egon".encode('utf-8'),那么新申請(qǐng)的內(nèi)存空間里存放的就是utf-8編碼的字符串egon了

針對(duì)python3如下圖

第四章 python3 語(yǔ)法基礎(chǔ)之字符集編碼格式

瀏覽網(wǎng)頁(yè)的時(shí)候,服務(wù)器會(huì)把動(dòng)態(tài)生成的Unicode內(nèi)容轉(zhuǎn)換為UTF-8再傳輸?shù)綖g覽器

第四章 python3 語(yǔ)法基礎(chǔ)之字符集編碼格式

如果服務(wù)端encode的編碼格式是utf-8, 客戶(hù)端內(nèi)存中收到的也是utf-8編碼的二進(jìn)制。

從上面的說(shuō)明,我們知道了unicode和utf-8的應(yīng)用場(chǎng)景,就需要用下面的方式進(jìn)行轉(zhuǎn)換:

字符串通過(guò)編碼轉(zhuǎn)換為字節(jié)碼,字節(jié)碼通過(guò)解碼轉(zhuǎn)換為字符串

str--->(encode)--->bytes,bytes--->(decode)--->str

參考:

https://www.cnblogs.com/zihe/p/6993891.html

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀(guān)點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多