<option id="mwy0y"><strong id="mwy0y"></strong></option>
  • <ul id="mwy0y"><sup id="mwy0y"></sup></ul>
  • <ul id="mwy0y"></ul>
  • <del id="mwy0y"><dfn id="mwy0y"></dfn></del><ul id="mwy0y"><sup id="mwy0y"></sup></ul>
  • <abbr id="mwy0y"></abbr>

    千鋒教育-做有情懷、有良心、有品質的職業教育機構

    400-811-9990
    手機站
    千鋒教育

    千鋒學習站 | 隨時隨地免費學

    千鋒教育

    掃一掃進入千鋒手機站

    領取全套視頻
    千鋒教育

    關注千鋒學習站小程序
    隨時隨地免費學習課程

    上海
    • 北京
    • 鄭州
    • 武漢
    • 成都
    • 西安
    • 沈陽
    • 廣州
    • 南京
    • 深圳
    • 大連
    • 青島
    • 杭州
    • 重慶
    當前位置:長沙千鋒IT培訓  >  技術干貨  >  Python2.x中的編碼問題

    Python2.x中的編碼問題

    來源:千鋒教育
    發布人:xqq
    時間: 2023-11-11 07:11:21

    1.str和unicode

    str和unicode都是basestring的子類。嚴格意義上說,str其實是字節串,它是unicode經過編碼后的字節組成的序列。對UTF-8編碼的str'漢'使用len()函數時,結果是3,因為實際上,UTF-8編碼的'漢'=='\xE6\xB1\x89'。

    unicode才是真正意義上的字符串,對字節串str使用正確的字符編碼進行解碼后獲得,并且len(u'漢')==1。

    再來看看encode()和decode()兩個basestring的實例方法,理解了str和unicode的區別后,這兩個方法就不會再混淆了:

    13#coding:UTF-8

    u=u'漢'

    printrepr(u)#u'\u6c49'

    s=u.encode('UTF-8')

    printrepr(s)#'\xe6\xb1\x89'

    u2=s.decode('UTF-8')

    printrepr(u2)#u'\u6c49'

    #對unicode進行解碼是錯誤的

    #s2=u.decode('UTF-8')

    #同樣,對str進行編碼也是錯誤的

    #u2=s.encode('UTF-8')

    需要注意的是,雖然對str調用encode()方法是錯誤的,但實際上Python不會拋出異常,而是返回另外一個相同內容但不同id的str;對unicode調用decode()方法也是這樣。很不理解為什么不把encode()和decode()分別放在unicode和str中而是都放在basestring中,但既然已經這樣了,我們就小心避免犯錯吧。

    2.字符編碼聲明

    源代碼文件中,如果有用到非ASCII字符,則需要在文件頭部進行字符編碼的聲明,如下:

    1#-*-coding:UTF-8-*-

    實際上Python只檢查#、coding和編碼字符串,其他的字符都是為了美觀加上的。另外,Python中可用的字符編碼有很多,并且還有許多別名,還不區分大小寫,比如UTF-8可以寫成u8。參見http://docs.python.org/library/codecs.html#standard-encodings。

    另外需要注意的是聲明的編碼必須與文件實際保存時用的編碼一致,否則很大幾率會出現代碼解析異常。現在的IDE一般會自動處理這種情況,改變聲明后同時換成聲明的編碼保存,但文本編輯器控們需要小心:)

    3.讀寫文件

    內置的open()方法打開文件時,read()讀取的是str,讀取后需要使用正確的編碼格式進行decode()。write()寫入時,如果參數是unicode,則需要使用你希望寫入的編碼進行encode(),如果是其他編碼格式的str,則需要先用該str的編碼進行decode(),轉成unicode后再使用寫入的編碼進行encode()。如果直接將unicode作為參數傳入write()方法,Python將先使用源代碼文件聲明的字符編碼進行編碼然后寫入。

    14#coding:UTF-8

    f=open('test.txt')

    s=f.read()

    f.close()

    printtype(s)#

    #已知是GBK編碼,解碼成unicode

    u=s.decode('GBK')

    f=open('test.txt','w')

    #編碼成UTF-8編碼的str

    s=u.encode('UTF-8')

    f.write(s)

    f.close()

    另外,模塊codecs提供了一個open()方法,可以指定一個編碼打開文件,使用這個方法打開的文件讀取返回的將是unicode。寫入時,如果參數是unicode,則使用open()時指定的編碼進行編碼后寫入;如果是str,則先根據源代碼文件聲明的字符編碼,解碼成unicode后再進行前述操作。相對內置的open()來說,這個方法比較不容易在編碼上出現問題。

    20#coding:GBK

    importcodecs

    f=codecs.open('test.txt',encoding='UTF-8')

    u=f.read()

    f.close()

    printtype(u)#

    f=codecs.open('test.txt','a',encoding='UTF-8')

    #寫入unicode

    f.write(u)

    #寫入str,自動進行解碼編碼操作

    #GBK編碼的str

    s='漢'

    printrepr(s)#'\xba\xba'

    #這里會先將GBK編碼的str解碼為unicode再編碼為UTF-8寫入

    f.write(s)

    f.close()

    4.與編碼相關的方法

    sys/locale模塊中提供了一些獲取當前環境下的默認編碼的方法。

    31#coding:gbk

    importsys

    importlocale

    defp(f):

    print'%s.%s():%s'%(f.__module__,f.__name__,f())

    #返回當前系統所使用的默認字符編碼

    p(sys.getdefaultencoding)

    #返回用于轉換Unicode文件名至系統文件名所使用的編碼

    p(sys.getfilesystemencoding)

    #獲取默認的區域設置并返回元祖(語言,編碼)

    p(locale.getdefaultlocale)

    #返回用戶設定的文本數據編碼

    #文檔提到thisfunctiononlyreturnsaguess

    p(locale.getpreferredencoding)

    #\xba\xba是'漢'的GBK編碼

    #mbcs是不推薦使用的編碼,這里僅作測試表明為什么不應該用

    printr"'\xba\xba'.decode('mbcs'):",repr('\xba\xba'.decode('mbcs'))

    #在筆者的Windows上的結果(區域設置為中文(簡體,中國))

    #sys.getdefaultencoding():gbk

    #sys.getfilesystemencoding():mbcs

    #locale.getdefaultlocale():('zh_CN','cp936')

    #locale.getpreferredencoding():cp936

    #'\xba\xba'.decode('mbcs'):u'\u6c49'

    以上內容為大家介紹了Python2.x中的編碼問題,希望對大家有所幫助,如果想要了解更多Python相關知識,請關注IT培訓機構:千鋒教育。

    聲明:本站稿件版權均屬千鋒教育所有,未經許可不得擅自轉載。

    猜你喜歡LIKE

    python實現WSGI的框架

    2023-11-13

    python打開文本文件有哪些方法?

    2023-11-13

    python使用loguru操作日志

    2023-11-13

    最新文章NEW

    python-=是什么意思

    2023-11-13

    pythonre是什么?

    2023-11-13

    python列表追加元素出錯的解決

    2023-11-13

    相關推薦HOT

    更多>>

    快速通道 更多>>

    最新開班信息 更多>>

    網友熱搜 更多>>