如何将ASCII字符串视为unicode并在python中对其中的转义字符进行转换?

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]

注意右前三个引号的字符串和破折号。

  • 使用带3个引号的字符串将确保如果用户在字符串中输入""(为清晰可见而添加的空格),则不会干扰评估器;
  • 最后的破折号是一个故障保护,以防用户的字符串以""'结尾。在分配结果之前,我们用[:-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>'