2016-11-16 214 views
2

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

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

我该如何去转换这个字符串?

回答

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,您可以“T弄清楚字节序或如何得到一个偶数字节,你可以欺骗:

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

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