中文python笔记_python 中文编码笔记
最近碰了很多釘子。。。
不得不說,python2.6相較于之前發(fā)布的版本,就編碼方面來說,有明顯的進(jìn)步。本機(jī)使用的是python2.6,同樣的代碼根本沒有遇到問題。到了服務(wù)器上部署時(shí),一臺(tái)服務(wù)器的python2.5和另一臺(tái)服務(wù)器的python2.4,都折磨得我苦不堪言。
先厘清幾個(gè)概念:python內(nèi)置的字符類型是unicode,當(dāng)需要進(jìn)行編碼轉(zhuǎn)換時(shí),都要先轉(zhuǎn)成unicode,然后再轉(zhuǎn)換成目標(biāo)編碼。而str類型是二進(jìn)制類型,例如
聲明變量uniStr=u'的',uniStr的類型為Unicode
執(zhí)行g(shù)bStr=uniStr.encode('gb2312'),則gbStr的類型為str,長度為18字節(jié)(gb2312標(biāo)準(zhǔn)里用兩個(gè)字節(jié)表示一個(gè)漢字)。
若執(zhí)行g(shù)bStr.encode('gb2312'),則會(huì)報(bào)錯(cuò),因?yàn)?#39;ascii' codec can't decode byte 0xd3 in position 0: ordinal not in range(128)。
關(guān)于unicode:unicode可以想象成一個(gè)比ascii大得多的碼表,能夠包含所有現(xiàn)存字符。每個(gè)字符有一個(gè)對應(yīng)的編碼,編碼的范圍是0到0x10ffff,那么我們可以使用32位的int來儲(chǔ)存一個(gè)unicode字符。但這樣比較浪費(fèi)空間,人們就提出了別的編碼方案,例如utf-8。簡而言之,編碼方案就是把unicode值映射成字節(jié)流,術(shù)語是encoding。
python默認(rèn)的編碼方案是ascii,所有超過128的unicode編碼都會(huì)報(bào)UnicodeEncodeError。
utf-8方案編碼方案是應(yīng)用較廣的一種,編碼規(guī)則如下:
unicode編碼值小于128,原封不動(dòng);
unicode編碼值在128到7ff,將轉(zhuǎn)換為2個(gè)字節(jié),每字節(jié)值范圍在128到255之間;
unicode編碼值大于7ff的,將轉(zhuǎn)換為3-4個(gè)字節(jié),每字節(jié)值范圍在128到255之間。
為了應(yīng)付編碼問題,可以用repr()函數(shù),type()函數(shù)來一探究竟。type能夠告訴你這是unicode還是str,如果通過repr看到形如u'\ua000'的串,一般就是unicode了。\u和\U的區(qū)別是一個(gè)用4位16進(jìn)制數(shù)表示,一個(gè)是8位16進(jìn)制數(shù)表示。ord()函數(shù)可以返回一個(gè)unicode字并返回它的unicode編碼(還記得上面提到的那張大碼表嗎?這編碼就是在表中的索引值)。
總結(jié)
以上是生活随笔為你收集整理的中文python笔记_python 中文编码笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android studio云测,And
- 下一篇: python之路day4_python之