vulcan

          低頭做事,抬頭看路

             :: 首頁 :: 聯系 :: 聚合  :: 管理
            41 Posts :: 7 Stories :: 28 Comments :: 0 Trackbacks
          用python處理html entity時,python編碼時出現一些問題,見下面的代碼
          import re
          message 
          = '密碼修改成功'
          regex 
          = '(&#(\\d{5});)'
          entities 
          = re.findall(regex, message)
          for entity in entities:
              message 
          = message.replace(entity[0], unichr(int(entity[1])))
          #print message #在pythonwin中執行沒有問題,在pydev中執行報錯
          print message.encode('gbk'#正常
          為了搞清除為什么會出錯,下面是我做的一些測試.
          下面是對'密碼'兩個字的一些測試,在pythonwin交互窗口中執行,雖然知道了要得到正確的中文該怎么在程序中處理,并且使得程序在pydev和pythonwin
          兩個環境中執行都不出錯,但是卻還是搞不清為什么會這個樣子.先記下罷.有能解釋底層機制的朋友,也請留言幫個忙吧.
          >>> s = '密碼'
          >>> s
          '\xc3\xdc\xc2\xeb'
          >>> su = u'密碼'
          >>> su
          u
          '\xc3\xdc\xc2\xeb'
          #u前綴表示是unicode編碼,但是里面實際存儲的是密碼兩個字的gbk編碼
          >>> print s
          密碼
          >>> print su #在pydev和SciTE中報錯,不能打印
          ?ü??
          >>> char1 = unichr(23494)
          >>> char2 = unichr(30721)
          >>> char1
          u
          '\u5bc6'
          >>> char2
          u
          '\u7801'
          >>> print char1

          >>> print char2

          >>> char = char1 + char2
          >>> char
          u
          '\u5bc6\u7801'
          >>> print char #在pydev和SciTE中會報錯為什么
          密碼
          >>> s.decode('gbk'#變成了unicode編碼16進制
          u'\u5bc6\u7801'
          >>> print s.decode('gbk'#在pydev和SciTE中不能正常打印輸出
          密碼
          >>> char.encode('gbk')
          '\xc3\xdc\xc2\xeb'
          >>> s
          '\xc3\xdc\xc2\xeb'
          >>> su
          u
          '\xc3\xdc\xc2\xeb'
          >>> char
          u
          '\u5bc6\u7801'
          >>> char.encode('gbk')
          '\xc3\xdc\xc2\xeb'
          >>> print s
          密碼
          >>> print char.encode('gbk')
          密碼

          Update 1:
          sys.setdefaultencoding()可以設置默認編碼供轉換時使用,但是Python啟動之后這個方法會被site.py刪除,因此必須reload(sys)然后調用sys.setdefaultencoding
          下面是我的測試方法,根據這里的結果,估計是pythonwin內啟動的交互環境對參數應該有了設置,不過sys.getdefaultencoding()的返回還是默認的ascii:
          '修改密碼成功的html entity是' "密码修改成功",在下面的python代碼中在這個網頁上顯示不對.把&要換成&符號
          #python 2.4 windows, execute in SciTe or Eclipse pydev
          #
          Note: if you execute this script in pythonwin, the result may be different!
          import sys
          import re
          reload(sys) 
          #should do this to setdefault encoding of sys, 
          #
          this method is deleted in site.py [/PYTHON_HOME/Lib] by default

          #try to set default encoding other than default encoding
          #
          default ascii # Error: out 1, out 3, out 6
          #
          sys.setdefaultencoding('gbk')  #all right, but a warning raised
          #
          sys.setdefaultencoding('utf-8')  #out 1, out 3, out 6: unreadable in outputwindow, may be right if change the console encoding
          message = '密码修改成功'
          regex 
          = '(&#(\\d{5});)'
          entities 
          = re.findall(regex, message)
          for entity in entities:
              message 
          = message.replace(entity[0], unichr(int(entity[1])))
          #message : u'\u5bc6\u7801\u4fee\u6539\u6210\u529f'
          print message #out 1
          #
          message.encode('gbk') : '\xc3\xdc\xc2\xeb\xd0\xde\xb8\xc4\xb3\xc9\xb9\xa6'
          print message.encode('gbk'#out 2
          char1 = unichr(23494)
          char2 
          = unichr(30721)
          char 
          = char1 + char2
          #char : u'\u5bc6\u7801'
          print char #out 3
          #
          char.encode('gbk') : '\xc3\xdc\xc2\xeb'
          print char.encode('gbk'#out 4
          s='密碼'
          #s : '\xc3\xdc\xc2\xeb'
          print s #out 5
          #
          s.decode('gbk') : u'\u5bc6\u7801'
          print s.decode('gbk'#out 6
          posted on 2007-11-16 12:59 vulcan 閱讀(2459) 評論(0)  編輯  收藏 所屬分類: Python編程

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 临猗县| 万载县| 额尔古纳市| 温州市| 广汉市| 宝坻区| 常德市| 临桂县| 鲁甸县| 怀仁县| 昆山市| 通许县| 永川市| 鹿泉市| 元朗区| 贺兰县| 灵寿县| 若尔盖县| 武鸣县| 许昌县| 孝义市| 白水县| 孟津县| 沁源县| 仁怀市| 东阳市| 甘德县| 高唐县| 道真| 淮阳县| 扶风县| 垣曲县| 长葛市| 永平县| 孟连| 伊金霍洛旗| 德兴市| 浦县| 永城市| 枝江市| 清丰县|