【转载】对python字符串编码的理解
用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‘) #正常
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‘)
密码
>>> 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:
#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:
抱歉,暂停评论。