zou*_*yjs 6 python unicode decode
虽然标题是一个问题,但简短的答案显然是否定的.我试过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'
Run Code Online (Sandbox Code Playgroud)
上面的例子如上.我正在使用windows简体中文.默认编码是gbk,python shell也是.我得到了两个unicode对象不相等.
更新
a = '??'.decode('gbk')
>>> a
u'\u4e2d\u6587'
>>> print a
??
>>> b = u'??'
>>> print b
ÖÐÎÄ
Run Code Online (Sandbox Code Playgroud)
是的,如果编解码器成功解码字节,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'
Run Code Online (Sandbox Code Playgroud)
这些值确实不相等,因为它们不是同一个文本.
同样,使用正确的编解码器很重要; 不同的编解码器会导致非常不同的结果:
>>> print u'\u4e2d\u6587'.encode('gbk').decode('latin1')
ÖÐÎÄ
Run Code Online (Sandbox Code Playgroud)
我将示例文本编码为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'
Run Code Online (Sandbox Code Playgroud)
在处理不同的文本来源时,必须做出类似的决定.例如,从源文件中读取字符串文字要求您只使用ASCII(并使用转义码代替其他所有内容),或者在文件顶部为Python提供显式编解码符号.
我恳请你阅读:
绝对最低每个软件开发人员绝对必须知道关于Unicode和字符集(没有任何借口!)作者:Joel Spolsky
Ned Batchelder的实用Unicode
更全面地了解Unicode的工作原理,以及Python如何处理Unicode.
| 归档时间: |
|
| 查看次数: |
1162 次 |
| 最近记录: |