python中utf8占几个字节_为什么utf8占用3个字节
UNICODE是萬(wàn)能編碼,包含了所有符號(hào)的編碼,它規(guī)定了所有符號(hào)在計(jì)算機(jī)底層的二進(jìn)制的表示順序。有關(guān)Unicode為什么會(huì)出現(xiàn)就不敘述了,Unicode是針對(duì)所有計(jì)算機(jī)的使用者定義一套統(tǒng)一的編碼規(guī)范,這樣計(jì)算機(jī)使用者就避免了編碼轉(zhuǎn)換的問(wèn)題。Unicode定義了所有符號(hào)的二進(jìn)制形式,也就是符號(hào)如何在計(jì)算機(jī)內(nèi)部存儲(chǔ)的,而且每個(gè)符號(hào)規(guī)定都必須使用兩個(gè)字節(jié)來(lái)表示,也就是用16位二進(jìn)制去代表一個(gè)符號(hào),這樣就導(dǎo)致了一個(gè)問(wèn)題,英文編碼的空間浪費(fèi),因?yàn)樵贏NSI中的符號(hào)都是一個(gè)字節(jié)來(lái)表示的,而使用了UNICODE編碼就白白浪費(fèi)了一個(gè)字節(jié)。也就代表著Unicode需要使用兩倍的空間去存儲(chǔ)相應(yīng)的ANSI編碼下的符號(hào)。雖然現(xiàn)在硬盤(pán)或者內(nèi)存都很廉價(jià),但是在網(wǎng)絡(luò)傳輸中,這個(gè)問(wèn)題就凸顯出來(lái)了,你可以這樣想想,本來(lái)1M的帶寬在ANSI下可以代表1024*1024個(gè)字符,但是在Unicode下卻只能代表1024*1024/2個(gè)字符。也就是1MB/s的帶寬只能等價(jià)于512KB/s,這個(gè)很可怕啊。所以為了解決符號(hào)在網(wǎng)絡(luò)中傳輸?shù)睦速M(fèi)問(wèn)題,就出現(xiàn)了UTF-8編碼,Unicode transfer format -8 ,后面的8代表是以8位二進(jìn)制為單位來(lái)傳輸符號(hào)的,但是這樣又導(dǎo)致了一個(gè)問(wèn)題,雖然UTF-8可以使用一個(gè)字節(jié)來(lái)表示ANSI下的符號(hào),但是對(duì)于其它類(lèi)似漢語(yǔ)的符號(hào),得需要兩個(gè)字節(jié)來(lái)表示,所以計(jì)算機(jī)不知道如何去截取一個(gè)符號(hào),也就是一個(gè)符號(hào)對(duì)應(yīng)的二進(jìn)制的截取開(kāi)始位置和截取結(jié)束位置。所以為了解決Unicode下的ANSI符號(hào)的空間浪費(fèi)和網(wǎng)絡(luò)傳輸下如何截取字符的問(wèn)題,UTF規(guī)定:如果一個(gè)符號(hào)只占一個(gè)字節(jié),那么這個(gè)8位字節(jié)的第一位就為0。如果為兩個(gè)字節(jié),那么規(guī)定第一個(gè)字節(jié)的前兩位都為1,然后第一個(gè)字節(jié)的第三位為0,第二個(gè)字節(jié)的前兩位為10,然后如果是三個(gè)字節(jié)的話(huà),那么第一個(gè)字節(jié)的前三位為111,第四位為0,剩余的兩個(gè)字節(jié)的前兩位都為10。按照這樣的算法去思考一個(gè)中文字符的UTF-8是怎么表示的:一個(gè)中文字符需要兩個(gè)字節(jié)來(lái)表示,兩個(gè)字節(jié)一共是16位,那么UTF-8下,兩個(gè)字節(jié)是不夠的,因?yàn)閮蓚€(gè)字節(jié)下,第一個(gè)字節(jié)已經(jīng)占據(jù)了三位:110,然后剩余的一個(gè)字節(jié)占據(jù)了兩位:10,現(xiàn)在就只剩下8位,與Unicode下的兩個(gè)字節(jié),18位去表示任意一個(gè)字符是相悖的,也就是Unicode下的18位減去UTF-8下的8位=8位,剛好差了一個(gè)字節(jié)的空間,所以就使用三個(gè)字節(jié)去表示非ANSI字符:三個(gè)字節(jié)下,一共是24位,第一個(gè)字節(jié)頭四位是:1110,后兩個(gè)字節(jié)的前兩位都是:10,那么24位-8位=16位,剛好兩個(gè)字節(jié)去表示Unicode下的任意一個(gè)非ANSI字符。這也就是為什么UTF-8需要使用三個(gè)字節(jié)去表示一個(gè)非ANSI字符的原因了!
多個(gè)字節(jié)提供的位數(shù)超過(guò)了所需要的,多余的位以0補(bǔ)全到編碼前面
總結(jié)
以上是生活随笔為你收集整理的python中utf8占几个字节_为什么utf8占用3个字节的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 同一事务多次加for_Synchroni
- 下一篇: python re正则匹配_python