Сегодня я делал какую-то работу и столкнулся с проблемой, когда что-то "выглядело смешно". Я интерпретировал некоторые строковые данные как utf-8 и проверял закодированную форму. Данные поступали из ldap (в частности, из Active Directory) через python-ldap. Там нет сюрпризов.
Итак, я несколько раз сталкивался с байтовой последовательностью '\ xe3 \ x80 \ xb0', которая при декодировании как utf-8 является кодовой точкой 3030 ( wavy dash ). Мне нужны строковые данные в 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'
Если бы кто-нибудь мог сказать мне, что именно здесь происходит, это было бы очень ценно.