2008-11-06 21 views

回答

43

我花了一段时间来弄清楚这一个,但this page有最好的答案:

>>> s = '\u003cfoo/\u003e' 
>>> s.decode('unicode-escape') 
u'<foo/>' 
>>> s.decode('unicode-escape').encode('ascii') 
'<foo/>' 

还有一个“原始的Unicode逃逸”的编解码器来处理其他的方式来指定Unicode字符串 - 检查链接页面的“Unicode的构造函数”一节的详细信息(因为我不是那种Unicode-saavy)。

编辑:另见Python Standard Encodings

+0

这正是我想要的。谢谢一堆! – John 2008-11-06 02:32:55

-1

它不同的地方是有点危险的字符串来自,但如何:

>>> s = '\u003cfoo\u003e' 
>>> eval('u"'+s.replace('"', r'\"')+'"').encode('ascii') 
'<foo>' 
+1

不幸的是,我们的输入来自用户,所以这对我们来说太危险了。 – John 2008-11-06 02:32:17

1

在Python 2.5上,正确的编码是“unicode_escape”,而不是“unicode-escape”(注意下划线)。

我不确定新版本的Python是否更改了unicode名称,但是这里只使用了下划线。

无论如何,这就是它。

2

斯内德尔德说:

这取决于有点危险,其中的字符串是从, 来,但怎么样:

>>> s = '\u003cfoo\u003e' 
>>> eval('u"'+s.replace('"', r'\"')+'"').encode('ascii') 
'<foo>' 

实际上可制成安全这个方法像这样:

>>> s = '\u003cfoo\u003e' 
>>> s_unescaped = eval('u"""'+s.replace('"', r'\"')+'-"""')[:-1] 

在结束三引号之前注意三重字符串和破折号。

  1. 使用3引用字符串将确保如果用户在字符串中进入“\\””(添加了视觉清晰度空格)它不会扰乱评价者;
  2. 在端破折号如果用户的字符串以'\'结尾,则为失效保护。在我们分配结果之前,我们用[:-1]分割插入的连字符

因此,不需要担心用户输入的内容,只要它以原始格式捕获即可。

0

在某些时候,当你遇到特殊字符,如字符串中的中国文字或表情符号要解码看起来像这样的,即错误,你会遇到的问题:

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> 
相关问题