【问题标题】:Python 2.7, convert utf8 string to asciiPython 2.7,将 utf8 字符串转换为 ascii
【发布时间】:2017-03-30 04:17:46
【问题描述】:

我正在使用 python 2.7.12 我有一个字符串,其中包含一个 unicode 文字,它不是 Unicode 类型。我想将其转换为文本。这个例子解释了我想要做什么。

>>> s
'\x00u\x00s\x00e\x00r\x00n\x00a\x00m\x00e\x00'
>>> print s
username
>>> type(s)
<type 'str'>
>>> s == "username"
False

我将如何转换这个字符串?

【问题讨论】:

    标签: python-2.7 utf-8


    【解决方案1】:

    这不是 UTF-8,它是 UTF-16,虽然不清楚它是大端还是小端(你没有 BOM,而且你有一个前导和尾随 NUL 字节,使其长度不均匀)。对于 ASCII 范围内的文本,UTF-8 与 ASCII 无法区分,而 UTF-16 将 NUL 字节与 ASCII 编码字节交替(如您的示例中所示)。

    无论如何,转换为纯 ASCII 相当容易,您只需要以一种或另一种方式处理不均匀的长度:

    s = 'u\x00s\x00e\x00r\x00n\x00a\x00m\x00e\x00' # I removed \x00 from beginning manually
    sascii = s.decode('utf-16-le').encode('ascii')
    
    # Or without manually removing leading \x00
    sascii = s.decode('utf-16-be', errors='ignore').encode('ascii')
    

    当然,如果您的输入只是 NUL 散布的 ASCII,并且您无法确定字节顺序或如何获得偶数字节,则可以作弊:

    sascii = s.replace('\x00', '')
    

    但是在输入是一些完全不同的编码的情况下,这不会引发异常,因此它可能会隐藏指定您期望会捕获的错误。

    【讨论】:

      猜你喜欢
      • 2018-03-07
      • 1970-01-01
      • 1970-01-01
      • 2011-01-21
      • 2012-01-17
      • 2014-01-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多