How do I treat an ASCII string as unicode and unescape the escaped characters in it in python?
例如,如果我有一个Unicode字符串,我可以像这样将其编码为一个ASCII字符串:
1 2 | >>> u'\u003cfoo/\u003e'.encode('ascii') '<foo/>' |
但是,我有这样一个ASCII字符串:
1 | '\u003foo\u003e' |
…我想转换成与上面第一个示例中相同的ASCII字符串:
1 | '<foo/>' |
我花了一段时间才弄明白这一点,但这一页给出了最好的答案:
1 2 3 4 5 | >>> s = '\u003cfoo/\u003e' >>> s.decode( 'unicode-escape' ) u'<foo/>' >>> s.decode( 'unicode-escape' ).encode( 'ascii' ) '<foo/>' |
还有一个"原始Unicode转义"编解码器来处理指定Unicode字符串的另一种方式——查看链接页的"Unicode构造函数"部分了解更多详细信息(因为我不是Unicode Saavy)。
编辑:另请参见python标准编码。
内德·巴切尔德说:
It's a little dangerous depending on where the string is coming from,
but how about:
1
2
3 >>> s = '\u003cfoo\u003e'
>>> eval('u"'+s.replace('"', r'"')+'"').encode('ascii')
'<foo>'
实际上,这种方法可以像这样安全:
1 2 | >>> s = '\u003cfoo\u003e' >>> s_unescaped = eval('u"""'+s.replace('"', r'"')+'-"""')[:-1] |
注意右前三个引号的字符串和破折号。
所以不需要担心用户输入的内容,只要它是以原始格式捕获的。
在某些情况下,当您在要解码的字符串中遇到特殊字符(如汉字或表情符号)时,可能会遇到问题,即出现如下错误:
1 | UnicodeEncodeError: 'ascii' codec can't encode characters in position 109-123: ordinal not in range(128) |
对于我的情况(twitter数据处理),我解码如下,以允许我看到所有字符,没有错误
1 2 3 | >>> s = '\u003cfoo\u003e' >>> s.decode( 'unicode-escape' ).encode( 'utf-8' ) >>> <foo> |
在python 2.5上,正确的编码是"unicode _escape",而不是"unicode escape"(注意下划线)。
我不确定更新版本的python是否更改了unicode名称,但这里只使用下划线。
不管怎样,就是这样。
这有点危险,取决于绳子从哪里来,但是如何:
1 2 3 | >>> s = '\u003cfoo\u003e' >>> eval('u"'+s.replace('"', r'"')+'"').encode('ascii') '<foo>' |