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 阅读(2409) 评论(0)  编辑  收藏 所属分类: Python编程

只有注册用户登录后才能发表评论。


网站导航: