用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








下面是對'密碼'兩個字的一些測試,在pythonwin交互窗口中執行,雖然知道了要得到正確的中文該怎么在程序中處理,并且使得程序在pydev和pythonwin
兩個環境中執行都不出錯,但是卻還是搞不清為什么會這個樣子.先記下罷.有能解釋底層機制的朋友,也請留言幫個忙吧.












































Update 1:
sys.setdefaultencoding()可以設置默認編碼供轉換時使用,但是Python啟動之后這個方法會被site.py刪除,因此必須reload(sys)然后調用sys.setdefaultencoding
下面是我的測試方法,根據這里的結果,估計是pythonwin內啟動的交互環境對參數應該有了設置,不過sys.getdefaultencoding()的返回還是默認的ascii:
'修改密碼成功的html entity是' "密码修改成功",在下面的python代碼中在這個網頁上顯示不對.把&要換成&符號
































