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

时间:2008-11-06 01:55:40

标签: python unicode ascii

例如,如果我有 unicode 字符串,我可以将其编码为 ASCII 字符串,如下所示:

>>> u'\u003cfoo/\u003e'.encode('ascii')
'<foo/>'

然而,我有例如这个 ASCII 字符串:

'\u003foo\u003e'

...我想变成与上面第一个例子中相同的 ASCII 字符串:

'<foo/>'

5 个答案:

答案 0 :(得分:45)

我花了一段时间才想出这个,但this page得到了最好的答案:

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

还有一个'raw-unicode-escape'编解码器来处理指定Unicode字符串的另一种方式 - 查看链接页面的“Unicode Constructors”部分以获取更多详细信息(因为我不是那种Unicode-saavy)

编辑:另见Python Standard Encodings

答案 1 :(得分:2)

Ned Batchelder 说:

  

根据字符串的来源,它有点危险,   但是如何:

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

实际上这种方法可以像以下一样安全:

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

在结束3引号之前注意三重引号字符串和短划线。

  1. 使用3引号字符串将确保如果用户在字符串中输入'\\''(为了清晰起见而添加空格),则不会破坏评估者;
  2. 如果用户的字符串以'\“'结尾,那么末尾的破折号是一个故障保护。在我们分配结果之前,我们用[:-1]
  3. 分割插入的破折号

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

答案 2 :(得分:1)

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

我不确定较新版本的Python是否更改了unicode名称,但此处仅使用下划线。

无论如何,就是这样。

答案 3 :(得分: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>

答案 4 :(得分:0)

根据字符串的来源,它有点危险,但是如何:

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