【问题标题】:Removing hexadecimal characters from a unicode object从 unicode 对象中删除十六进制字符
【发布时间】:2017-03-23 06:21:07
【问题描述】:

我正在尝试从我的字符串中删除十六进制字符 \xef\xbb\xbf 但是我收到以下错误。

不太清楚如何解决这个问题。

>>> x = u'\xef\xbb\xbfHello'
>>> x
u'\xef\xbb\xbfHello'
>>> type(x)
<type 'unicode'>
>>> print x
Hello
>>> print x.replace('\xef\xbb\xbf', '')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xef in position 0: ordinal not in range(128)
>>>

【问题讨论】:

    标签: python unicode


    【解决方案1】:

    您需要替换 unicode 对象,否则 Python2 将尝试使用 ascii 编解码器对 x 进行编码以在其中搜索 str

    >>> x = u'\xef\xbb\xbfHello'
    >>> x
    u'\xef\xbb\xbfHello'
    >>> print(x.replace(u'\xef\xbb\xbf',u''))
    Hello
    

    这仅适用于 Python2。 在 Python3 中,这两个版本都可以使用。

    【讨论】:

      【解决方案2】:

      尝试使用decodeunicode 函数,如下所示:

      x.decode('utf-8')
      

      unicode(string, 'utf-8')
      

      来源:UnicodeDecodeError: 'ascii' codec can't decode byte 0xef in position 1

      【讨论】:

        【解决方案3】:

        真正的问题是您的 Unicode 字符串一开始就被错误地解码了。这些字符是一个 UTF-8 字节顺序标记 (BOM) 字符,被误解码为(可能)latin-1 或 cp1252。

        理想情况下,修复它们的解码方式,但您可以通过重新编码为 latin1 并正确解码来扭转错误:

        >>> x = u'\xef\xbb\xbfHello'
        >>> x.encode('latin1').decode('utf8') # decode correctly, U+FEFF is a BOM.
        u'\ufeffHello'
        >>> x.encode('latin1').decode('utf-8-sig') # decode and handle BOM.
        u'Hello'
        

        【讨论】:

          猜你喜欢
          • 2016-03-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-05
          • 2018-01-02
          • 2015-10-09
          • 1970-01-01
          相关资源
          最近更新 更多