[转载] python中字符串编码形式及其所占字节
參考鏈接: Python中的字節(jié)對(duì)象與字符串
1.常見(jiàn)字符串編碼錯(cuò)誤?
在使用Python讀文件時(shí)經(jīng)常遇到編碼問(wèn)題引起的錯(cuò)誤,比如:?
UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 30: illegal multibyte sequence?
遇到這種異常時(shí)可以通過(guò)讀文件時(shí)規(guī)定編碼方式來(lái)解決,如下:?
with open('zhengfu.txt','r',encoding='UTF-8') as read_zhengfu:?
如果文件中還包含其他非UTF-8編碼的字符,或者無(wú)關(guān)的特殊字符,可以再加入一個(gè)參數(shù),如下:?
with open('zhengfu.txt','r',encoding='UTF-8',errors='ignore') as read_zhengfu:?
有時(shí)讀文件時(shí)還會(huì)遇到一種問(wèn)題就是第一行數(shù)據(jù)的開(kāi)頭多了一串‘'\ufeff’字符。比如:?
?
如果用print(list[0])是看不到這個(gè)字符的。對(duì)這個(gè)沒(méi)有研究過(guò), 如果要去掉這串字符的話,可以使用‘utf-8-sig’這種編碼方式:?
with open('user_dict_2.txt','r',encoding='utf-8-sig') as read_dict:?
但是我在寫(xiě)入文件時(shí)設(shè)置為‘utf-8-sig’格式時(shí)不起作用,寫(xiě)入的文件中還是有這個(gè)字符。?
另外,在對(duì)字符串進(jìn)行匹配的時(shí)候,'\ufeff’會(huì)影響字符串的匹配結(jié)果。?
?
2.字符串編碼?
關(guān)于計(jì)算機(jī)內(nèi)部如何表示字符串,為何又要?jiǎng)?chuàng)造這么多種編碼方式,推薦閱讀 https://www.cnblogs.com/hhwu/p/9529942.html 這篇博客里作者講的很明白,這里主要是想?yún)R總介紹Python中的字符串函數(shù)。?
2.1 chr()函數(shù)和ord()函數(shù)?
chr()函數(shù)是將一個(gè)整數(shù)返回一個(gè)對(duì)應(yīng)的字符,ord()函數(shù)則相反,其返回一個(gè)字符的數(shù)值表示(返回的是Unicode值的十進(jìn)制表示)。在Python3.6的版本中,chr()中整數(shù)的范圍不再是0到255,擴(kuò)大到了1114111,大于改值時(shí),報(bào)ValueError錯(cuò)誤。而ord()函數(shù)中只能接受單字符串作為其輸入,否則會(huì)報(bào)TypeError錯(cuò)誤。?
print(chr(65)) #輸出'A'
print(ord('A')) #輸出65?
2.2 Unicode編碼?
雖然Python 3的內(nèi)存中Unicode來(lái)保存字符串,但為了節(jié)省內(nèi)存,Python3內(nèi)部使用3種方式存儲(chǔ)Unicode字符。具體分為以下三種:?
Latin-1一個(gè)字符占一個(gè)字節(jié)。比如ASCII碼值UCS-2一個(gè)字符占兩個(gè)字節(jié)。常見(jiàn)的中文都占用2個(gè)字節(jié)UCS-4一個(gè)字符占四個(gè)字節(jié)。比較偏僻的中文還有emoj表情通常占用4個(gè)字節(jié)。
python中提供了內(nèi)置函數(shù)來(lái)查看每個(gè)字符串對(duì)象的編碼類(lèi)型。如果一個(gè)字符串的所有字符都能用ASCII碼來(lái)表示,那么該字符串使用Latin-1。如果字符串中出現(xiàn)了中文,則采用UCS-2編碼即可。如果字符串中有一些生僻字或者emoj表情的話,則必須使用UCS-4編碼。注意在Python中,一個(gè)字符串中的所有字符只能采用一種編碼方式,不能混用。因?yàn)橐坏┗煊?#xff0c;那么字符串中每個(gè)字符所占的字節(jié)數(shù)必定不同,那么字符串將不能使用下標(biāo)進(jìn)行快速直接讀取。下面來(lái)具體看看字符串具體在內(nèi)存中所占用的字節(jié)數(shù)。?
字符串的長(zhǎng)度和該字符串所占的字節(jié)數(shù)不相同。字符串的長(zhǎng)度可以直接通過(guò)len()f方法來(lái)求,而字符串在內(nèi)存中實(shí)際所占的字節(jié)數(shù)需要通過(guò)getsizeof()函數(shù)來(lái)計(jì)算。?
import sys
#返回字符串所占字節(jié)數(shù),返回78
print(sys.getsizeof('你好'))
#返回字符串長(zhǎng)度,長(zhǎng)度為2
print(len("你好"))?
從以下的實(shí)驗(yàn)結(jié)果可以發(fā)現(xiàn),一個(gè)空字符串在內(nèi)存中就占了49個(gè)字節(jié)的內(nèi)存。?
?
Python內(nèi)存中的數(shù)據(jù),不管是int型還是字符串,都會(huì)額外占用一些內(nèi)存空間保存一些信息,這些信息保存了字符串的一些基礎(chǔ)信息,并且能夠決定字符串所能進(jìn)行的操作。Python一般會(huì)為字符串分配49到80個(gè)字節(jié)的額外空間。?
下面這段代碼分別展示了字符‘a(chǎn)’在三種不用的Unicode編碼中所占的字節(jié)數(shù)。?
import sys
#latin-1編碼時(shí)'a'所占的字節(jié)數(shù),其結(jié)果為:1
print(sys.getsizeof('ab')-sys.getsizeof('b'))
#ucs-2編碼時(shí)'a'所占的字節(jié)數(shù),其結(jié)果為:2
print(sys.getsizeof('a你好')-sys.getsizeof('你好'))
#ucs-4編碼時(shí)'a'所占的字節(jié)數(shù),其結(jié)果為:4
print(sys.getsizeof('a?')-sys.getsizeof('?'))
總結(jié)
以上是生活随笔為你收集整理的[转载] python中字符串编码形式及其所占字节的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: gn fast-gn_GN的完整形式是什
- 下一篇: [转载] python中print()函