python中字符串中文乱码_Python字符串开头的bquot;、uquot;、rquot;与中文乱码
先看幾個(gè)常見(jiàn)的中文亂碼:s?=?u'More更多請(qǐng)關(guān)注我'print('--encoded---')
print('【utf-8】',?bytes(s,?encoding='utf-8'))
print('【utf-16】',?bytes(s,?encoding='utf-16'))
print('【gbk】',?bytes(s,?encoding='gb2312'))
print('【unicode-escape】',?bytes(s,?encoding='unicode-escape'))
print('--decoded--')
print('【utf-8=>utf-8】',?s.encode('utf-8').decode('utf-8'))
print('【utf-8=>utf-16】',?s.encode('utf-8').decode('utf-16'))
print('【utf-8=>ISO-8859-1】',?s.encode('utf-8').decode('ISO-8859-1'))
print('【gbk=>ISO-8859-1】',?s.encode('gbk').decode('ISO-8859-1'))
運(yùn)行得到:
image.png
仔細(xì)看一下,找到下面兩個(gè)規(guī)律:要么是上面encode編碼后的\...\...\...,要么是錯(cuò)誤解碼decode之后的亂碼。
除了兩個(gè)最后輸出utf-16的,其他的都能正常顯示英文More。
u'和b'
第一行我們用了u'More...',這個(gè)u是可以省略的,在python3里面所有字符串默認(rèn)都是utf-8編碼解碼的,這個(gè)u就是指示要用utf-8編碼,所以可省略。
上面四個(gè)encoded輸出的開(kāi)頭都有b'...'開(kāi)頭,因?yàn)榇a里面是bytes(s,...),bytes是字節(jié),字符串可以用很多種編碼方式變?yōu)樽止?jié),就像密碼電報(bào)一樣,同一個(gè)信息可以用不同的算法加密成各種不同的亂碼,如果你不知道是什么編碼的,你就讀不出。python2中只有字節(jié)形式的字符串,沒(méi)有u'開(kāi)頭的utf-8編碼的,所以python3才發(fā)明了b'開(kāi)頭這種表示字節(jié)的方法,兼容舊版本。
字符串經(jīng)過(guò)特定的方式編碼coding成為字節(jié),然后再通過(guò)正確的方式也可以把字節(jié)還原為字符串。關(guān)鍵就是要知道原來(lái)的編碼方式
.encode('utf-8').decode('utf-8')這句當(dāng)然看起來(lái)沒(méi)毛病,所以也輸出了正確的文字。
而后面s.encode('utf-8').decode('utf-16')這種就不正常了,編碼encode方式和decode解碼方式不一樣,就導(dǎo)致了亂碼。
解決亂碼問(wèn)題
首先要想辦法知道或者實(shí)驗(yàn)出原來(lái)是什么編碼的,你可以對(duì)照上面輸出的代碼進(jìn)行猜測(cè)。
如果是很多斜杠的bytes,那么就直接嘗試不同的decode:s=b'More\xe6\x9b\xb4\xe5\xa4\x9a\xe8\xaf\xb7\xe5\x85\xb3\xe6\xb3\xa8\xe6\x88\x91'print(s.decode('utf-8'))
如果是被錯(cuò)誤解碼的亂碼,那么就嘗試反向encode再decode就能還原:#亂碼來(lái)自s.encode('gbk').decode('ISO-8859-1')s='More?ü?à??1?×¢?ò'.encode('ISO-8859-1').decode('gbk')print(s)
r' 強(qiáng)制不轉(zhuǎn)義
先看下這個(gè)問(wèn)題:s1=r'.\folder\new.file's2=b'.\folder\new.file's3=u'.\folder\new.file'print('r:',s1)
print('b:',s2)
print('u:',s3)
它的輸出是這樣的,你肯定猜不到:
image.png
為什么會(huì)是這樣?只有r開(kāi)頭的正常。
我們都知道代碼里面字符串要用引號(hào)包裹,那么字符串里面要是也有引號(hào)怎么辦?換行怎么辦?
編程語(yǔ)言會(huì)用特殊方法來(lái)表示這些特殊符號(hào),叫做轉(zhuǎn)義字符。比如\n表示回車(chē)換行,\f表示換頁(yè),\"表示雙引號(hào),\'標(biāo)示單引號(hào)...
那么真的遇到了\n怎么辦?就像上面那個(gè)情況,b'把f編碼成了\x0,而u'直接把\f弄沒(méi)了,\n變成了回車(chē)...
為了避免這種情況,就有了r'強(qiáng)制不轉(zhuǎn)義,優(yōu)點(diǎn)是明顯的,不會(huì)亂變,缺點(diǎn)也是有的,那就不能真的顯示回車(chē)換行了啊。
一般在目錄地址和正則表達(dá)式中我們常用r'避免混亂。
作者:zhyuzh3d
鏈接:https://www.jianshu.com/p/220ee0f219c6
總結(jié)
以上是生活随笔為你收集整理的python中字符串中文乱码_Python字符串开头的bquot;、uquot;、rquot;与中文乱码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 谁说菜鸟不会数据分析python下载_刻
- 下一篇: c++输出的值精确到小数点后5位_七年级