Python 2.7 Python 2.7,将utf8字符串转换为ascii

Python 2.7 Python 2.7,将utf8字符串转换为ascii,python-2.7,utf-8,Python 2.7,Utf 8,我正在使用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 >>s “\

我正在使用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
>>s
“\x00u\x00s\x00e\x00r\x00n\x00a\x00m\x00e\x00”
>>>印刷品
用户名
>>>类型
>>>s==“用户名”
假的

如何转换此字符串?

这不是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', '')
但在输入是完全不同的编码的情况下,这不会引发异常,因此它可能会隐藏指定您期望捕获的错误