python與字符編碼問(wèn)題的示例分析-創(chuàng)新互聯(lián)

這篇文章主要介紹了python與字符編碼問(wèn)題的示例分析,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

成都創(chuàng)新互聯(lián)2013年開(kāi)創(chuàng)至今,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站制作、做網(wǎng)站網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元江川做網(wǎng)站,已為上家服務(wù),為江川各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:028-86922220

故事零:編碼的定義

我們從“SOS“(國(guó)際通用求助信號(hào))開(kāi)始,它的摩斯密碼的編碼是:

“…---…”,想一下為什么選用S、O、S來(lái)作為求救信號(hào)?因?yàn)樗?jiǎn)單,容易辨別且不容易發(fā)錯(cuò)呀!
那么,字符編碼就是:

´給定一系列字符,對(duì)每個(gè)字符賦予一個(gè)數(shù)值,用數(shù)值來(lái)代表對(duì)應(yīng)的字符,這一數(shù)值就是字符的編碼。例如,我們給字符'A'賦予數(shù)值0x41,則0x41就是字符'A'的編碼。字符編碼是字符的表現(xiàn)、儲(chǔ)存方式。

字符編碼需要處理兩件事:

(1)規(guī)定一個(gè)字符集中的字符由多少個(gè)字節(jié)表示;

(2)制定該字符集的字符編碼表,即該字符集中每個(gè)字符對(duì)應(yīng)的(二進(jìn)制)值。

字符集:´給定一系列字符并賦予對(duì)應(yīng)的編碼后,所有這些字符和編碼對(duì)組成的集合就是字符集。´比如,給定字符列表為{'A','B'}時(shí),{'A'=>0x41,‘B'=>0x42}就是一個(gè)字符集。

常見(jiàn)字符集有:

ASCII
GB2312
GBK
GB18030
Big5
Unicode

一張圖總結(jié):

python與字符編碼問(wèn)題的示例分析

故事一:Python2與Python3的字符串類型?

python2中的字符串有str和unicode類型,而python3中字符串只有unicode類型。比如 ‘你好'是str字符串,而 u'你好'則是unicode字符串。

故事二:decode()和encode()傻傻分不清?

decode() 是將str字符串轉(zhuǎn)化為unicode字符串;encode() 是將unicode字符串轉(zhuǎn)化為str字符串。所以要做一些編碼的轉(zhuǎn)換通常是以u(píng)nicode作為中間編碼做轉(zhuǎn)換。如name.decode(“GB2312”)表示將GB2312編碼的字符串name轉(zhuǎn)換成unicode編碼,name.encode(“GB2312”)表示將unicode字符串name轉(zhuǎn)換成GB2312編碼。

python與字符編碼問(wèn)題的示例分析

故事三:UnicodeEncodeError: ‘a(chǎn)scii' codec can't encode character?

我們先看看兩張圖,是不是很煩?

python與字符編碼問(wèn)題的示例分析

python與字符編碼問(wèn)題的示例分析

下面我們看個(gè)例子:

python與字符編碼問(wèn)題的示例分析

當(dāng)用u'字符串'申明這個(gè)字符串變量時(shí)就指明了該字符串是使用unicode字符編碼。當(dāng)要將unicode字符串轉(zhuǎn)換為str字符串或者寫(xiě)入文件時(shí),python2默認(rèn)使用ASCII 碼保存數(shù)據(jù),而ASCII 碼無(wú)法識(shí)別大于128 的字符,于是報(bào)了上面的錯(cuò)誤。
附ASCII碼表:

python與字符編碼問(wèn)題的示例分析

故事四:unicode是什么?

unicode可以看做一個(gè)終極的字符編碼方法,它給出了地球上常用字符的二進(jìn)制映射,而且所有的二進(jìn)制字符串唯一地表示一個(gè)字符。但是,unicode只給出了字符和二進(jìn)制串的對(duì)應(yīng)關(guān)系,并沒(méi)有給出存儲(chǔ)形式。而不同字符所占用的存儲(chǔ)空間可能不同,比如ASCII 在unicode中只占用了一個(gè)字節(jié)即可,而常用漢字在unicode中需要占用兩個(gè)字節(jié),還有一些羅馬字符可能需要三個(gè)或以上字節(jié)。如果直接存儲(chǔ)的話可能導(dǎo)致無(wú)法分割字符串,也無(wú)法正確解碼出字符。

故事五:UTF-8橫空出世?

互聯(lián)網(wǎng)的普及,強(qiáng)烈要求出現(xiàn)一種統(tǒng)一的編碼方式。這時(shí)候UTF-8 出場(chǎng)。UTF-8 是unicode在計(jì)算機(jī)中的一種實(shí)現(xiàn)方式。UTF-8是一種變長(zhǎng)編碼,每個(gè)字符占1-4 個(gè)字節(jié)。UTF-8 將字節(jié)分為數(shù)值位和標(biāo)識(shí)位,數(shù)值位真正保存字符編碼數(shù)值,標(biāo)識(shí)位表示這個(gè)字節(jié)是屬于哪個(gè)字符的、或者該字符占多少個(gè)字節(jié)。UTF-8 編碼方法:

單字節(jié),首位為標(biāo)識(shí)位0;多字節(jié)字符首字節(jié)標(biāo)志位1··10開(kāi)頭,字符占多少字節(jié)則有多少1,其他字節(jié)標(biāo)識(shí)位10開(kāi)頭;

§  單字節(jié)字符: 0xxxxxxx (以0 開(kāi)頭標(biāo)志位,數(shù)值位用x 表示)

§  雙字節(jié)字符: 110xxxxx 10xxxxxx

§  三字節(jié)字符: 1110xxxx 10xxxxxx 10xxxxxx

§  四字節(jié)字符: 11110xxx 10xxxxxx 10xxxxxx10xxxxxx

unicode變?yōu)閁TF-8 編碼非常簡(jiǎn)單,unicode二進(jìn)制按照從低到高,填充UTF-8的數(shù)值位,除去那些不真正表示數(shù)值的標(biāo)識(shí)位(字節(jié)開(kāi)頭的0,10,110,1110和11110),順序也是由低到高。以漢字“你”為例,可見(jiàn)它的unicode編碼為“4f60”(01001111 01100000)。

python與字符編碼問(wèn)題的示例分析

從“你”的unicode值范圍可以看到需要三個(gè)字節(jié),接著從低位字節(jié)向高位字節(jié)填充得到“你”的UTF-8 編碼(高位沒(méi)有填充完則用0補(bǔ)充)。

python與字符編碼問(wèn)題的示例分析

可以看到將UTF-8 用于標(biāo)記位(紅色)的位去掉,合并可以得到原始的unicode碼。

故事六:"unicode-escape"與"unicode-unescape"

“\u”是表示unicode的轉(zhuǎn)義字符,用\uxxxx這種方式表示unicode字符就是”unicode-escape”方式。說(shuō)人話:´一句話:xxx.decode(“unicode-escape”)相當(dāng)于把xxx解碼成unicode類型并返回。
而用”%uxxxx”的方式表示unicode字符,這種方式就是”unicode-unescape”,常用于javascript。

番外故事七:讀了那么多年書(shū),你真的了解“全半角”?

全角---指一個(gè)字符占用兩個(gè)標(biāo)準(zhǔn)字符位置。
半角---指一字符占用一個(gè)標(biāo)準(zhǔn)的字符位置。
引申:寫(xiě)程序時(shí)雙引號(hào)、冒號(hào)、小括號(hào)等為啥如此糾結(jié)?
--我國(guó)專家在制定GB2312字符集時(shí),ASCII里本來(lái)就有的數(shù)字、標(biāo)點(diǎn)、字母都統(tǒng)統(tǒng)重新編了兩個(gè)字節(jié)長(zhǎng)的編碼。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“python與字符編碼問(wèn)題的示例分析”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司,關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、網(wǎng)站設(shè)計(jì)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

網(wǎng)站名稱:python與字符編碼問(wèn)題的示例分析-創(chuàng)新互聯(lián)
網(wǎng)站URL:http://muchs.cn/article36/cdccpg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)、網(wǎng)站設(shè)計(jì)公司、面包屑導(dǎo)航網(wǎng)站策劃、網(wǎng)站設(shè)計(jì)ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司