久久精品国产亚洲高清|精品日韩中文乱码在线|亚洲va中文字幕无码久|伊人久久综合狼伊人久久|亚洲不卡av不卡一区二区|精品久久久久久久蜜臀AV|国产精品19久久久久久不卡|国产男女猛烈视频在线观看麻豆

    1. <style id="76ofp"></style>

      <style id="76ofp"></style>
      <rt id="76ofp"></rt>
      <form id="76ofp"><optgroup id="76ofp"></optgroup></form>
      1. 千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機構(gòu)

        手機站
        千鋒教育

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

        千鋒教育

        掃一掃進入千鋒手機站

        領(lǐng)取全套視頻
        千鋒教育

        關(guān)注千鋒學習站小程序
        隨時隨地免費學習課程

        當前位置:首頁  >  技術(shù)干貨  > Python2.x中的編碼問題

        Python2.x中的編碼問題

        來源:千鋒教育
        發(fā)布人:xqq
        時間: 2023-11-07 10:44:45 1699325085

        1.str和unicode

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

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

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

        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調(diào)用encode()方法是錯誤的,但實際上Python不會拋出異常,而是返回另外一個相同內(nèi)容但不同id的str;對unicode調(diào)用decode()方法也是這樣。很不理解為什么不把encode()和decode()分別放在unicode和str中而是都放在basestring中,但既然已經(jīng)這樣了,我們就小心避免犯錯吧。

        2.字符編碼聲明

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

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

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

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

        3.讀寫文件

        內(nèi)置的open()方法打開文件時,read()讀取的是str,讀取后需要使用正確的編碼格式進行decode()。write()寫入時,如果參數(shù)是unicode,則需要使用你希望寫入的編碼進行encode(),如果是其他編碼格式的str,則需要先用該str的編碼進行decode(),轉(zhuǎn)成unicode后再使用寫入的編碼進行encode()。如果直接將unicode作為參數(shù)傳入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。寫入時,如果參數(shù)是unicode,則使用open()時指定的編碼進行編碼后寫入;如果是str,則先根據(jù)源代碼文件聲明的字符編碼,解碼成unicode后再進行前述操作。相對內(nèi)置的open()來說,這個方法比較不容易在編碼上出現(xiàn)問題。

        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.與編碼相關(guān)的方法

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

        31#coding:gbk

        importsys

        importlocale

        defp(f):

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

        #返回當前系統(tǒng)所使用的默認字符編碼

        p(sys.getdefaultencoding)

        #返回用于轉(zhuǎn)換Unicode文件名至系統(tǒng)文件名所使用的編碼

        p(sys.getfilesystemencoding)

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

        p(locale.getdefaultlocale)

        #返回用戶設(shè)定的文本數(shù)據(jù)編碼

        #文檔提到thisfunctiononlyreturnsaguess

        p(locale.getpreferredencoding)

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

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

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

        #在筆者的Windows上的結(jié)果(區(qū)域設(shè)置為中文(簡體,中國))

        #sys.getdefaultencoding():gbk

        #sys.getfilesystemencoding():mbcs

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

        #locale.getpreferredencoding():cp936

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

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

        tags: python培訓
        聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
        10年以上業(yè)內(nèi)強師集結(jié),手把手帶你蛻變精英
        請您保持通訊暢通,專屬學習老師24小時內(nèi)將與您1V1溝通
        免費領(lǐng)取
        今日已有369人領(lǐng)取成功
        劉同學 138****2860 剛剛成功領(lǐng)取
        王同學 131****2015 剛剛成功領(lǐng)取
        張同學 133****4652 剛剛成功領(lǐng)取
        李同學 135****8607 剛剛成功領(lǐng)取
        楊同學 132****5667 剛剛成功領(lǐng)取
        岳同學 134****6652 剛剛成功領(lǐng)取
        梁同學 157****2950 剛剛成功領(lǐng)取
        劉同學 189****1015 剛剛成功領(lǐng)取
        張同學 155****4678 剛剛成功領(lǐng)取
        鄒同學 139****2907 剛剛成功領(lǐng)取
        董同學 138****2867 剛剛成功領(lǐng)取
        周同學 136****3602 剛剛成功領(lǐng)取
        相關(guān)推薦HOT
        湘乡市| 大荔县| 彰化市| 通江县| 阜南县| 双牌县| 文化| 镇原县| 柏乡县| 浪卡子县| 保靖县| 湛江市| 泸定县| 辽阳县| 故城县| 扶绥县| 闻喜县| 天全县| 岑巩县| 崇信县| 瑞昌市| 前郭尔| 平阳县| 观塘区| 蓬安县| 西畴县| 平舆县| 山阴县| 百色市| 鸡泽县| 响水县| 深州市| 贵溪市| 巢湖市| 芦溪县| 孟州市| 都匀市| 湖南省| 青州市| 宁都县| 仙桃市|