29

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

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

但是,我有例如这个ASCII字符串:

'\u003foo\u003e'

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

'<foo/>'
4

5 回答 5

53

我花了一段时间才弄清楚这一点,但这个页面有最好的答案:

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

还有一个“raw-unicode-escape”编解码器来处理指定 Unicode 字符串的另一种方式——查看链接页面的“Unicode 构造函数”部分了解更多详细信息(因为我不是那种 Unicode 知识)。

编辑:另见Python 标准编码

于 2008-11-06T02:26:05.433 回答
2

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

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

无论如何,就是这样。

于 2009-11-17T18:14:37.327 回答
2

在某些时候,当您在要解码的字符串中遇到特殊字符(如汉字或表情符号)时,您会遇到问题,即如下所示的错误:

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>
于 2014-03-29T03:06:42.217 回答
1

内德巴彻尔德说:

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

>>> 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] 分割插入的破折号

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

于 2012-07-01T12:29:51.557 回答
0

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

>>> s = '\u003cfoo\u003e'
>>> eval('u"'+s.replace('"', r'\"')+'"').encode('ascii')
'<foo>'
于 2008-11-06T02:01:12.740 回答