我今天正在做一些工作,遇到了一个“看起来很有趣”的问题。我一直在将一些字符串数据解释为 utf-8,并检查编码形式。数据通过 python-ldap 来自 ldap(特别是 Active Directory)。那里没有惊喜。
所以我几次遇到字节序列'\xe3\x80\xb0',当解码为utf-8时,它是unicode代码点3030(波浪破折号)。我需要 utf-16 格式的字符串数据,所以很自然地我通过 .encode('utf-16') 对其进行了转换。不幸的是,python 似乎不喜欢这个角色:
D:\> python
Python 2.6.4 (r264:75708, Oct 26 2009, 08:23:19) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> u"\u3030"
u'\u3030'
>>> u"\u3030".encode("utf-8")
'\xe3\x80\xb0'
>>> u"\u3030".encode("utf-16-le")
'00'
>>> u"\u3030".encode("utf-16-be")
'00'
>>> '\xe3\x80\xb0'.decode('utf-8')
u'\u3030'
>>> '\xe3\x80\xb0'.decode('utf-8').encode('utf-16')
'\xff\xfe00'
>>> '\xe3\x80\xb0'.decode('utf-8').encode('utf-16-le').decode('utf-8')
u'00'
IronPython 似乎也不是粉丝:
D:\ipy
IronPython 2.6 Beta 2 (2.6.0.20) on .NET 2.0.50727.3053
Type "help", "copyright", "credits" or "license" for more information.
>>> u"\u3030"
u'\u3030'
>>> u"\u3030".encode('utf-8')
u'\xe3\x80\xb0'
>>> u"\u3030".encode('utf-16-le')
'00'
如果有人能告诉我这里到底发生了什么,将不胜感激。