ps:string是一些非ascii字符,如中文,XXX是当前的字符串编码
>>> u'中文' == '中文'.decode('gbk') False //The first one is u'\xd6\xd0\xce\xc4' while the second one u'\u4e2d\u6587'
上面的例子如上.我正在使用windows简体中文.默认编码是gbk,python shell也是.我得到了两个unicode对象不相等.
更新
a = '中文'.decode('gbk') >>> a u'\u4e2d\u6587' >>> print a 中文 >>> b = u'中文' >>> print b ÖÐÎÄ
解决方法
您的示例文本未使用正确的编解码器;你有GBK编码的文本,解码为Latin1:
>>> print u'\u4e2d\u6587' 中文 >>> u'\u4e2d\u6587'.encode('gbk') '\xd6\xd0\xce\xc4' >>> u'\u4e2d\u6587'.encode('gbk').decode('latin1') u'\xd6\xd0\xce\xc4'
这些值确实不相等,因为它们不是同一个文本.
同样,使用正确的编解码器很重要;不同的编解码器会导致非常不同的结果:
>>> print u'\u4e2d\u6587'.encode('gbk').decode('latin1') ÖÐÎÄ
我将示例文本编码为Latin-1,而不是GBK或UTF-8.解码可能已成功,但生成的文本不可读.
另请注意,粘贴非ASCII字符仅起作用,因为Python解释器已正确检测到我的终端编解码器.我可以将浏览器中的文本粘贴到终端中,然后将文本作为UTF-8编码的数据传递给Python.因为Python已经向终端询问了使用了什么编解码器,所以它能够从u’….’Unicode字面值再次解码.当打印encoded.decode(‘utf8’)unicode结果时,Python再次对数据进行自动编码以适合我的终端编码.
要查看Python检测到的编解码器,请打印sys.stdin.encoding:
>>> import sys >>> sys.stdin.encoding 'UTF-8'
在处理不同的文本来源时,必须做出类似的决定.例如,从源文件中读取字符串文字要求您只使用ASCII(并使用转义码代替其他所有内容),或者在文件顶部为Python提供显式编解码符号.
我恳请你阅读:
> The Absolute Minimum Every Software Developer Absolutely,Positively Must Know About Unicode and Character Sets (No Excuses!) by Joel Spolsky
> Python Unicode HOWTO
> Pragmatic Unicode由Ned Batchelder
更全面地了解Unicode的工作原理,以及Python如何处理Unicode.