用python處理html entity時(shí),python編碼時(shí)出現(xiàn)一些問題,見下面的代碼
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中執(zhí)行沒有問題,在pydev中執(zhí)行報(bào)錯(cuò)
print message.encode('gbk') #正常
為了搞清除為什么會(huì)出錯(cuò),下面是我做的一些測(cè)試.
下面是對(duì)'密碼'兩個(gè)字的一些測(cè)試,在pythonwin交互窗口中執(zhí)行,雖然知道了要得到正確的中文該怎么在程序中處理,并且使得程序在pydev和pythonwin
兩個(gè)環(huán)境中執(zhí)行都不出錯(cuò),但是卻還是搞不清為什么會(huì)這個(gè)樣子.先記下罷.有能解釋底層機(jī)制的朋友,也請(qǐng)留言幫個(gè)忙吧.
>>> s = '密碼'
>>> s
'\xc3\xdc\xc2\xeb'
>>> su = u'密碼'
>>> su
u'\xc3\xdc\xc2\xeb'
#u前綴表示是unicode編碼,但是里面實(shí)際存儲(chǔ)的是密碼兩個(gè)字的gbk編碼
>>> print s
密碼
>>> print su #在pydev和SciTE中報(bào)錯(cuò),不能打印
?ü??
>>> 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中會(huì)報(bào)錯(cuò)為什么
密碼
>>> s.decode('gbk') #變成了unicode編碼16進(jìn)制
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()可以設(shè)置默認(rèn)編碼供轉(zhuǎn)換時(shí)使用,但是Python啟動(dòng)之后這個(gè)方法會(huì)被site.py刪除,因此必須reload(sys)然后調(diào)用sys.setdefaultencoding
下面是我的測(cè)試方法,根據(jù)這里的結(jié)果,估計(jì)是pythonwin內(nèi)啟動(dòng)的交互環(huán)境對(duì)參數(shù)應(yīng)該有了設(shè)置,不過sys.getdefaultencoding()的返回還是默認(rèn)的ascii:
'修改密碼成功的html entity是' "密码修改成功",在下面的python代碼中在這個(gè)網(wǎng)頁上顯示不對(duì).把&要換成&符號(hào)
#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