如何在Python中将ASCII字符串视为Unicode并取消其中转义字符的转义?

30
例如,如果我有一个Unicode字符串,我可以将其编码为ASCII字符串,如下所示:
>>> u'\u003cfoo/\u003e'.encode('ascii')
'<foo/>'

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

'\u003foo\u003e'

...我想将其转换为与上面第一个示例中相同的ASCII字符串:

'<foo/>'
5个回答

53

我花了一些时间才搞清楚这个问题,但是 这个页面 给出了最好的答案:

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

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

编辑:还可以参考Python标准编码


1
请注意,此内容仅适用于Python 2。在Python 3中,所有字符串都是Unicode对象。https://dev59.com/IF4b5IYBdhLWcg3w5VE9 - Guido

2
在Python 2.5中,正确的编码是"unicode_escape",而不是"unicode-escape"(注意下划线)。我不确定较新版本的Python是否更改了Unicode名称,但在这里只有使用下划线才有效。总之,就是这样。

2

在某些时候,你会遇到问题,当你想要解码包含中文字符或表情符号的字符串时,例如以下错误:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 109-123: ordinal not in range(128)

对于我的案例(Twitter数据处理),我进行了以下解码,以便能够看到所有字符而无错误

>>> s = '\u003cfoo\u003e'
>>> s.decode( 'unicode-escape' ).encode( 'utf-8' )
>>> <foo>

1

Ned Batchelder 说:

It's a little dangerous depending on where the string is coming from, but how about:

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

实际上,这种方法可以这样安全地实现:

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

注意三引号字符串和在闭合的三引号前面的破折号。

  1. 使用三引号字符串可以确保如果用户在字符串中输入 ' \\" '(为了视觉清晰添加空格),它不会干扰评估器;
  2. 末尾的破折号是一种故障转移,以防用户的字符串以 ' \" ' 结尾。在分配结果之前,我们使用 [:-1] 切片插入的破折号。

因此,只要以原始格式捕获,就不需要担心用户输入什么。


0

根据字符串的来源不同,这可能有点危险,但是怎么样:

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

1
很不幸,我们的输入来自用户,这对我们来说太危险了。 - John

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接