以前無(wú)論是用Python2還是Python3盗冷,在中文顯示上都會(huì)遇到些許的障礙结序。即便Python3對(duì)中文編碼的友好度已經(jīng)大大提升梅掠,但是還是會(huì)出現(xiàn)顯示的是編碼的內(nèi)容而不是轉(zhuǎn)譯之后的中文的情況圆存。
現(xiàn)在抵乓,對(duì)于這種情況有了一個(gè)比較好的處理方式伴挚,在Python3中靶衍,可以利用chardet包來(lái)查詢編碼的格式是什么。
例如這樣一段編碼
b'[2018-07-16 15:42:58 +0800] [14859] [INFO] \xe5\xbc\x80\xe5\xa7\x8b\xe4\xbc\x91\xe7\x9c\xa0Zzzzzzzzzzzzz.....\n'
是我用Python程序讀取log日志文件后輸出的結(jié)果茎芋。很明顯可以看出是編碼的內(nèi)容沒(méi)有正確地轉(zhuǎn)義成中文颅眶,但是對(duì)于編碼格式以及強(qiáng)制轉(zhuǎn)義方式都不了解的我甚至都不清楚這個(gè)是utf還是gbk。這個(gè)時(shí)候就可以利用chardet田弥。
import subprocess
import chardet
p = subprocess.Popen('tail -F apperr.log', shell=True, stdout=subprocess.PIPE,stderr=subprocess.PIPE,)
while True:
line = p.stdout.readline()
if line:
print(chardet.detect(line))
程序的結(jié)果為:
{'encoding': 'utf-8', 'confidence': 0.938125, 'language': ''}
這個(gè)時(shí)候我們就確定了我們的編碼格式涛酗,那么只需要去找如何將bytes格式的編碼強(qiáng)制轉(zhuǎn)換成中文了。
line = p.stdout.readline()
if line:
print(line.decode('utf-8'))
這樣偷厦,輸出就成了中文了:
[2018-07-16 15:49:50 +0800] [14859] [INFO] 開(kāi)始休眠Zzzzzzzzzzzzz.....
同時(shí)商叹,在python中讀取了一段string后要篩選出該string中的中文字符:
def cleanHTML(self, text):
ans = ""
for a in text:
if (a > u'\u4e00') and (a < u'\u9fff'):
ans += a
return ans