虽然标题是一个问题,但简短的答案显然是否定的。我试过shell。真正的问题是为什么? 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
ÖÐÎÄ
答案 0 :(得分:5)
是的,如果编解码器成功解码字节,str.decode()
通常会返回unicode
字符串。但是,如果使用正确的编解码器,则值仅表示相同的文本。
您的示例文本未使用正确的编解码器;你有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提供显式编解码符号。
我恳请你阅读:
以更全面地了解Unicode的工作方式,以及Python如何处理Unicode。
答案 1 :(得分:4)
假设标题为Python2.7。
答案是否。不,因为当您发出string.decode(XXX)
时,您将获得Unicode,具体取决于您作为参数传递的编解码器。
当你使用u'string'
编解码器是由shell的当前编码推断出来的,或者如果它是一个文件,你将得到ascii
作为默认值或者你插入的# coding: utf-8
特别注释脚本的开头。
只是要清除,如果确保编解码器XXX
始终与脚本输入(shell或文件)使用的编解码器相同,则两种方法的行为几乎相同。
希望这有帮助!