【问题标题】:How do I treat an ASCII string as unicode and unescape the escaped characters in it in python?如何将 ASCII 字符串视为 unicode 并在 python 中对其中的转义字符进行转义?
【发布时间】:2010-09-21 00:18:51
【问题描述】:

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

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

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

'\u003foo\u003e'

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

'<foo/>'

【问题讨论】:

    标签: python unicode ascii


    【解决方案1】:

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

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

    【讨论】:

    • 很遗憾,我们的输入来自用户,所以这对我们来说太危险了。
    【解决方案2】:

    我花了一段时间才弄清楚这个问题,但this page 给出了最佳答案:

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

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

    编辑:另见Python Standard Encodings

    【讨论】:

    【解决方案3】:

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

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

    不管怎样,就是这样。

    【讨论】:

      【解决方案4】:

      Ned Batchelder 说:

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

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

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

      【讨论】:

        【解决方案5】:

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

        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>
        

        【讨论】:

          猜你喜欢
          • 2010-12-09
          • 1970-01-01
          • 2013-07-19
          • 2010-11-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多