例如,如果我有一个的unicode串,我可以编码它作为一个ASCII 串像这样:我如何将ASCII字符串视为unicode并在其中跳过python中的转义字符?
>>> u'\u003cfoo/\u003e'.encode('ascii')
'<foo/>'
然而,我有例如这ASCII字符串:
'\u003foo\u003e'
...我想变成同一ASCII字符串在我上面的第一个例子:
'<foo/>'
例如,如果我有一个的unicode串,我可以编码它作为一个ASCII 串像这样:我如何将ASCII字符串视为unicode并在其中跳过python中的转义字符?
>>> u'\u003cfoo/\u003e'.encode('ascii')
'<foo/>'
然而,我有例如这ASCII字符串:
'\u003foo\u003e'
...我想变成同一ASCII字符串在我上面的第一个例子:
'<foo/>'
我花了一段时间来弄清楚这一个,但this page有最好的答案:
>>> s = '\u003cfoo/\u003e'
>>> s.decode('unicode-escape')
u'<foo/>'
>>> s.decode('unicode-escape').encode('ascii')
'<foo/>'
还有一个“原始的Unicode逃逸”的编解码器来处理其他的方式来指定Unicode字符串 - 检查链接页面的“Unicode的构造函数”一节的详细信息(因为我不是那种Unicode-saavy)。
它不同的地方是有点危险的字符串来自,但如何:
>>> s = '\u003cfoo\u003e'
>>> eval('u"'+s.replace('"', r'\"')+'"').encode('ascii')
'<foo>'
不幸的是,我们的输入来自用户,所以这对我们来说太危险了。 – John 2008-11-06 02:32:17
在Python 2.5上,正确的编码是“unicode_escape”,而不是“unicode-escape”(注意下划线)。
我不确定新版本的Python是否更改了unicode名称,但是这里只使用了下划线。
无论如何,这就是它。
斯内德尔德说:
这取决于有点危险,其中的字符串是从, 来,但怎么样:
>>> s = '\u003cfoo\u003e' >>> eval('u"'+s.replace('"', r'\"')+'"').encode('ascii') '<foo>'
实际上可制成安全这个方法像这样:
>>> s = '\u003cfoo\u003e'
>>> s_unescaped = eval('u"""'+s.replace('"', r'\"')+'-"""')[:-1]
在结束三引号之前注意三重字符串和破折号。
因此,不需要担心用户输入的内容,只要它以原始格式捕获即可。
在某些时候,当你遇到特殊字符,如字符串中的中国文字或表情符号要解码看起来像这样的,即错误,你会遇到的问题:
UnicodeEncodeError: 'ascii' codec can't encode characters in position 109-123: ordinal not in range(128)
对于我的情况下(微博数据处理),我解码如下,让我看到没有错误的所有字符
>>> s = '\u003cfoo\u003e'
>>> s.decode('unicode-escape').encode('utf-8')
>>> <foo>
这正是我想要的。谢谢一堆! – John 2008-11-06 02:32:55