python2 3的文字及終端顯示的中文編譯碼問題

2021-10-02 01:37:46 字數 2488 閱讀 9760

1、python2和python3的中文編譯碼有很大的不同,其中python2的字串str型別和unicode型別是不同的,而python3的str字串型別和unicode是相同的,因此操作會有不同。

2、終端顯示中文的問題:終端顯示中文需要知道sys和locale的預設編碼設定,windows和linux系統對應的是不同的,一般windows稍微sys.getdefaultencoding會得到ascii,而linux一般會得到utf-8,當然這些可能也會因為設定而改變;windows的locale預設編碼一般是cp396,cp396是gbk編碼的別名,linux的locale預設utf-8,注意locale編碼的不同,會影響終端的顯示;

例如終端上a='中文',locale是gbk的可以直接print和print(a.decode('gbk'))都可以輸出中文,其中type(a)是str型別,type(a.decode('gbk'))是unicode型別,sr和unicode型別的中文可以直接print;locale是utf-8的也可以直接print或者print(a.decode('utf-8'));其中這裡的decode作用是根據locale預設編碼的不同而不同,會將申請的str型別的a轉成終端預設的unicode然後print(同樣unicode可以根據locale的不同encode轉成終端辨認的str型別。

其中unicode型別非常重要,因此unicode是各種型別轉換的中間過渡型別,如str轉utf-8,可以先將str轉成unicode,然後再轉成utf-8,其他型別轉換也是;unicode型別還有一大用處,比如將'中文'分成'中',『文』兩個文字,需要『中文『是unicode型別才行,只有unicode型別才能直接分成這種形式,具體的可以這麼做,假設locale是』gbk『,設a=』中文『,則a預設str型別,先a.decode('gbk')轉成unicode型別,然後c=[i for i in a.decode('gbk')],則c就是['中',』文『],同樣比較兩個中文文字是否相同,必須將比較的兩個中文用同乙個編碼後再比較,即unicode和unicode比較,str就和str型別的中文文字比較。當然python3的str和unicode相同,所以python3可以str中文型別和unicode中文型別直接比較。

str轉unicode可以兩種方式:

這種方式貌似沒什麼用

a=』中國『,a是str型別,假設locale是』gbk『,例如windows下,

第一種:則b=a.decode('gbk')

第二種:b=unicode(a,'gbk')

3、xml和txt檔案的中文讀取:python2的txt檔案中文寫入時,正常open,但是寫入中文是可以encode,比如寫入'中國',可以開啟檔案f,然後f.write(』中國『.encode('utf8'))或者gbk都行,只要在讀取相應的txt是用同乙個解碼即可,例如gbk寫入的txt,讀取可以char_dict = ;xml中文寫入一般是str('中國'),讀取時直接讀取,然後直接分詞,own_charater_all = [own_character for str in annotations_s['string_infos'] for own_character in str];

python3可以在open開啟txt或者xml檔案並寫入時,用open(檔案路徑,'w+', encoding='utf8'),用encoding指定寫入型別,python2無法用這種指定方式。

注意:精讀

精讀python2中, 從檔案txt讀進來的字串,或者我們自己輸入的字串都是記憶體中對應一定的編碼(比如ascii,utf-8)後的str型別,str.decode("utf-8")之後才是unicode型別 , unicode又可以編碼成各種型別。

python3 中,檔案讀進來和輸入的字串一開始都是unicode型別的字串,具體在記憶體中的編碼方式,由程式設計師自己設定,當然預設是utf-8編碼。這種處理方式更符合人的直覺。

理清楚了這個過程處理python2、3中的編碼問題就不是問題了。

4、**的前幾行# -*- coding:utf-8 -*-又是說明當前code檔案的編碼格式,有了這句說明,中文注釋就可以正常顯示,否則出錯或者顯示不正確,當然如果預設就是utf-8,則沒什麼影響。

5、在image上打中文標籤:需要decode,例如

##python2不加decode,在上顯示的是亂碼,其中strs是str型別,python3不需要decode,只要引數是unicode型別即可,python3的str就是unicode,python2需要根據相應的預設編碼將str轉成unicode。

draw.text(local, strs.decode('utf8'), colour, font=font)

6、a='中文',a是str型別;a=u'中文',a是unicode型別。

7、總之,python3的編碼問題遠少於python2.

8、linux下執行ocr任務時經常會報錯asciii canot....range(128)這種問題,就是編譯碼的問題,可以在執行python命令之前,輸入export lang='c.utf-8',就是修改linux的編譯碼,就可以正常輸出中文了

Python2 3直譯器inpurt 函式的區別

輸入函式 在python2中有兩種輸入函式,1 input 函式會自動識別輸入的引數的資料型別,並進行轉化,如下圖用python2.7.x進行演示 2 raw input 函式 不識別輸入的引數的資料型別,預設所有都是str型別,和python3中的input 一樣 在python2中有只有一種輸入...

關於Python2 3多程序的一些個人理解

關於多程序的一些理解 利用multiprocessing模組裡面的process類 這裡無論是python2還是3都是如此 from multiprocessing import process import time,os def run process name print os.getpid ...

Python 刪除整個文字中的空格,並按行顯示

希望以後每天寫一篇部落格,總結一下每天用到的基本功能,不然專案做完也就做完了,給自己留下的資料太少了。今天需要造大量的姓名和家庭住址的資料,因此根據讀取檔案中現有的lastname firstname以及省 市 道路等隨機生成大量的模擬姓名和住址。其中用python進行了簡單的文字處理,去掉文字中的...