【问题标题】:Remove utf-8 literals in a string python删除字符串 python 中的 utf-8 文字
【发布时间】:2019-01-13 09:07:30
【问题描述】:

我是 python 新手,我有一个类似的字符串:

s= 'HDCF\xc3\x82\xc2\xae FTAE\xc3\x82\xc2\xae Greater China'

我想删除字符串中的所有 unicode 文字,例如:

'\xc3\x82\xc2\xae'

我需要这样的输出:

'HDFC FTAE Greater China'

谁能帮我解决这个问题?

谢谢

【问题讨论】:

  • Python 2 和 Python 3 的字符串语法不同。准确的答案需要知道 s 是 Python 2 字节字符串还是 Python 3 Unicode 字符串。
  • 您的数据似乎是mojibake。你所拥有的是 'HDCF® FTAE® Greater China' 双编码为 UTF-8。

标签: python string unicode utf-8 hex


【解决方案1】:

在 Python 2 上(默认字符串类型为字节):

>>> s = 'HDCF\xc3\x82\xc2\xae FTAE\xc3\x82\xc2\xae Greater China'
>>> s.decode('ascii',errors='ignore').encode('ascii')
'HDCF FTAE Greater China'

在 Python 3 上(默认字符串类型为 Unicode):

>>> s = 'HDCF\xc3\x82\xc2\xae FTAE\xc3\x82\xc2\xae Greater China'
>>> s.encode('ascii',errors='ignore').decode('ascii')
'HDCF FTAE Greater China'

请注意,原始字符串是mojibake。理想情况下修复字符串的读取方式,但您可以使用 (Python 3) 撤消损坏:

>>> s.encode('latin1').decode('utf8').encode('latin1').decode('utf8')
'HDCF® FTAE® Greater China'

原始字符串被双重编码为​​ UTF-8。这是通过将字符串直接 1:1 转换回字节1,解码为 UTF-8,然后再次直接转换回字节并再次使用 UTF-8 解码来实现的。

这是 Python 2 版本:

>>> s = 'HDCF\xc3\x82\xc2\xae FTAE\xc3\x82\xc2\xae Greater China'
>>> print s.decode('utf8').encode('latin1').decode('utf8')
HDCF® FTAE® Greater China

1之所以有效,是因为latin1 编解码器是一个 256 字节的编码,并直接映射到前 256 个 Unicode 代码点。

【讨论】:

    【解决方案2】:

    如果您的目标是将字符串限制为与 ASCII 兼容的字符,则可以将其编码为 ASCII 并忽略不可编码的字符,然后再次对其进行解码:

    x = 'HDCF\xc3\x82\xc2\xae FTAE\xc3\x82\xc2\xae Greater China'
    print(x.encode("ascii", "ignore").decode("utf-8"))
    

    产生HDCF FTAE Greater China

    查看str.encode()bytes.decode()

    【讨论】:

    • 感谢回复,显示为 Error:UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 4: ordinal not in range(128)
    • 使用您提供的输入在 Python 3.6 上工作
    • 是的,我没有用这里发布的缩进测试它。通过将其放在两条单独的行上来修复它
    【解决方案3】:

    您可以使用string.printable 函数过滤您的字符串以检查您的字符是否可以打印:

    import string
    
    s= 'HDCF\xc3\x82\xc2\xae FTAE\xc3\x82\xc2\xae Greater China'
    
    printable = set(string.printable)
    s = "".join(filter(lambda c: c in printable, s))
    print(s)
    

    输出:

    HDCF FTAE Greater China
    

    参考this问题。

    【讨论】:

      【解决方案4】:

      可能是这个帮助,

      s = 'HDCF\xc3\x82\xc2\xae FTAE\xc3\x82\xc2\xae Greater China'
      d = ''.join([i for i in s if ord(i) < 127])
      print(d)
      # OUTPUT as: HDCF FTAE Greater China
      

      【讨论】:

        猜你喜欢
        • 2018-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-22
        • 2022-08-23
        • 2018-01-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多