用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: