1. <wbr id="cnjas"><legend id="cnjas"></legend></wbr>

          Linux培訓
          達內IT學院

          400-111-8989

          python 中文亂碼問題

          • 發布:Linux培訓
          • 來源:網絡
          • 時間:2015-07-09 11:00

          本文主要說明如何從網站獲取頁面,并且如何查找頁面中的中文字符。實驗中的平臺為python 2.7 。

          python2.7 太直接了,操作系統給它什么格式編碼的字符串,它就接收啥格式的字符串,默認的格式與你使用的格式不同,因此,各種錯誤出現了。

          解決方法:

          1.知道系統所使用的編碼格式

          2.把獲取的頁面先用系統格式解碼,然后在編碼為utf8格式

          3.你的腳本中統一使用uft8編碼

          4.處理結束,把你的字符串先utf8解碼,然后系統格式編碼。

          流程結束

          # -*- coding: utf-8 -*-
          
          import sys  
          
          import urllib2    
          
          # 獲得系統默認編碼格式
          
          sysCharType = sys.getfilesystemencoding()  
          
          # 獲取頁面
          
          headers = {'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}    
          
          req = urllib2.Request("http://www.baidu.com/", headers=headers)    
          
          html = urllib2.urlopen(req).read()  
          
          sysHtml = html.decode(sysCharType).encode('utf-8')  
          
          s  = '百度一下,你就知道'
          
          if html.find(s)!= -1:  
          
          print'未經轉化 字符匹配'
          
          else:  
          
          print'未經轉化 字符不匹配'
          
          if sysHtml.find(s)!= -1:  
          
          print'經過轉化 字符匹配'
          
          else:  
          
          print'經過轉化 字符不匹配'

          另,看了kiki113的文章后,大有收獲。kiki113的原始帖子地址。

          str為字節數組,它僅僅是一個字節流,沒有其它的含義。而unicode是一種編碼格式。我們可以把具有unicode編碼格式的字符串看做字節流,但是不能把隨意一個字節流當做unicode字符串解釋。這就是在進行字符編碼轉化中經常發生問題的直接原因。

          '您好'的幾種編碼編碼方式結果

          GBK\xc4\xfa\xba\xc3

          unicode \u60a8\u597d

          UTF-8\xe6\x82\xa8\xe5\xa5\xbd

          在 python中,如果將一個str直接編碼成另一種編碼例如UTF-8,則系統先把str解碼成unicode,然后把unicode編碼格式轉化為目標格式(UTF-8),而從str到unicode過程中,系統認為str為默認編碼格式,一般認為是ASCII,如果原始編碼不是ASCII則會發生錯誤。

          下面來看幾個例子

          1.查看默認編碼格式

          >> import sys  
          
          >>> sys.getdefaultencoding()  
          
          'ascii'
          
          >>> s = '您好'
          
          >>> s  
          
          '\xc4\xfa\xba\xc3'#這是GBK編碼格式的字節流
          
          >>> s1=u'您好'
          
          >>> s1  
          
          u'\xc4\xfa\xba\xc3'# 這個嗎,看看對象類型。u的意義是聲明它后面跟隨的字符串是unicode格式編碼,如果不是,則會出錯。
          
          <type 'str'>  
          
          >>> type(s1)  
          
          <type 'unicode'> #s1是unicode類型的,但是里面的內容是GBK格式的

          轉化到utf-8格式

          >>> su = s.encode('utf-8')  
          
          Traceback (most recent call last):  
          
           File "<pyshell#9>", line 1, in <module>  
          
             su = s.encode('utf-8')  
          
          UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4in position 0: ordinal notin range(128)  
          
          直接轉化發生錯誤  
          
          >>> su = s.decode('gbk').encode('utf-8')  
          
          >>> su  
          
          '\xe6\x82\xa8\xe5\xa5\xbd'
          
          >>> print su  
          
          鎮ㄥソ  
          
          >>> sun = su.decode('utf-8')  
          
          >>> sun  
          
          u'\u60a8\u597d'
          
          >>> print sun  
          
          您好  
          
          >>> s.decode('gbk')  
          
          u'\u60a8\u597d'
          
          <span>s1.decode('gbk')</span>  
          
          Traceback (most recent call last): File "<pyshell#17>", line 1, in <module> s1.decode('gbk')UnicodeEncodeError: 'ascii'

          文件的編碼格式和編碼聲明的作用 把'您好'分別保存為 ASCII格式文件,unicode格式文件,和UTF-8格式文件,使用16進制文件查看其查看文件內容。

          可見,采用不同的編碼格式,看起來一樣的字符,其存儲格式是不同的。編碼聲明就是顯式的說明文件中的字符編碼格式,并且告知系統,后面遇到的字符,全按照聲明的格式去解釋。例如腳本文件

          [python]view plaincopys = '您好'

          print repr(s)

          a.如果文件格式為utf-8,則str的值為:'\xe6\x82\xa8\xe5\xa5\xbd'

          b.如果文件格式為ASCII,則str的值為:'\xc4\xfa\xba\xc3'

          如果編碼格式和聲明不相符合呢?

          文件為UTF-8格式保存,聲明為GBK

          [python]view plaincopy# -*- coding: GBK -*-

          s = '您好'

          print repr(s)

          print s

          運行結果

          [python]view plaincopy'\xe6\x82\xa8\xe5\xa5\xbd'

          鎮ㄥソ

          文件為ASCII,聲明為UTF-8(我們知道文件會被保存為GBK格式)

          [python]view plaincopy'\xc4\xfa\xba\xc3'

          您好

          根據上面的討論,這個好像是理所當然的。來點神奇的。

          文件為UTF-8格式保存,聲明為GBK

          [python]view plaincopy# -*- coding: GBK -*-

          s = u'您好'

          print repr(s)

          print s

          運行結果為

          [python]view plaincopyu'\u93ae\u3125\u30bd'

          鎮ㄥソ

          為什么會這樣?在運行ss = u'您好'的時候,整個過程可分為以下幾步:

          1) 獲取'您好'的編碼:由文件編碼格式確定,為‘\xe6\x82\xa8\xe5\xa5\xbd’

          2) 轉成unicode編碼的時候,根據文件的顯示編碼格式聲明對'\xe6\x82\xa8\xe5\xa5\xbd'解碼,不是用utf-8解碼,而是用聲明編碼處指定的編碼GBK解碼,得到字符串‘鎮ㄥソ’',這三個字的unicode編碼就是u'/u93ae/u3125/u30bd',因此 print repr(ss)輸出的是/u93ae/u3125/u30bd。

          預約申請免費試聽課

          填寫下面表單即可預約申請免費試聽!怕錢不夠?可就業掙錢后再付學費! 怕學不會?助教全程陪讀,隨時解惑!擔心就業?一地學習,可全國推薦就業!

          上一篇:python基礎知識總結
          下一篇:Python實現十六進制與十進制

          關于 python 中的 setup.py

          Python 程序員的 10 個常見錯誤

          使用 Python 創建你自己的 Shell (上)

          2015年出現的十大流行 Python 庫

          • 掃碼領取資料

            回復關鍵字:視頻資料

            免費領取 達內課程視頻學習資料

          • 視頻學習QQ群

            添加QQ群:1143617948

            免費領取達內課程視頻學習資料

          Copyright ? 2021 Tedu.cn All Rights Reserved 京ICP備08000853號-56 京公網安備 11010802029508號 達內時代科技集團有限公司 版權所有

          選擇城市和中心
          黑龍江省

          吉林省

          河北省

          湖南省

          貴州省

          云南省

          廣西省

          海南省

          欧美做爰视频免费播放_做暖全过程免费的视频_性爱免费视频 百度 好搜 搜狗
          <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>