Python "\ x00" заполняется / utf-32 строка из cStringIO

Через cStringIO другой системы я написал некоторый unicode через:

u'content-length'.encode('utf-8')

и, читая это, используя unicode( stringio_fd.read(),'utf-8') , я получаю:

u'c \ x00 \ x00 \ x00o \ x00 \ x00 \ x00n \ x00 \ x00 \ x00t \ x00 \ x00 \ x00e \ x00 \ x00 \ x00n \ x00 \ x00 \ x00t \ x00 \ x00 \ x00- \ x00 \ x00 \ x00l \ x00 \ x00 \ x00e \ x00 \ x00 \ x00n \ x00 \ x00 \ x00g \ x00 \ x00 \ x00t \ x00 \ x00 \ x00h \ x00 \ x00 \ x00'

печать выше в терминале дает мне правильное значение, но, конечно, я не могу ничего полезного:

print unicode ("c \ x00 \ x00 \ x00o \ x00 \ x00 \ x00n \ x00 \ x00 \ x00t \ x00 \ x00 \ x00e \ x00 \ x00 \ x00n \ x00 \ x00 \ x00t \ x00 \ x00 \ x00- \ x00 \ x00 \ x00l \ x00 \ x00 \ x00e \ x00 \ x00 \ x00n \ x00 \ x00 \ x00g \ x00 \ x00 \ x00t \ x00 \ x00 \ x00h \ x00 \ x00 \ x00" )

Content-Length

print unicode ("c \ x00 \ x00 \ x00o \ x00 \ x00 \ x00n \ x00 \ x00 \ x00t \ x00 \ x00 \ x00e \ x00 \ x00 \ x00n \ x00 \ x00 \ x00t \ x00 \ x00 \ x00- \ x00 \ x00 \ x00l \ x00 \ x00 \ x00e \ x00 \ x00 \ x00n \ x00 \ x00 \ x00g \ x00 \ x00 \ x00t \ x00 \ x00 \ x00h \ x00 \ x00 \ x00 ") == u'content-length '

Ложь

Какой самый быстрый и дешевый способ превратить эту строку в строку, эквивалентную u'content-type' ? Я не могу изменить cStringIO


Обновления

Хотя ответ филагана верен, возникает проблема:

StringIO.StringIO (u'content типа '). ПолучитьЗначение (). Закодировать (' UTF-8' )

'Тип содержимого'

StringIO.StringIO (u'content типа '). GetValue (). Закодировать (' UTF-8 '). Декодировать (' UTF-8' )

u'content типа»

cStringIO.StringIO (u'content типа '). GetValue (). закодировать (' UTF-8 '). декодировать (' UTF-8' )

u'c \ x00 \ x00 \ x00o \ x00 \ x00 \ x00n \ x00 \ x00 \ x00t \ x00 \ x00 \ x00e \ x00 \ x00 \ x00n \ x00 \ x00 \ x00t \ x00 \ x00 \ x00- \ x00 \ x00 \ x00t \ x00 \ x00 \ x00y \ x00 \ x00 \ x00p \ x00 \ x00 \ x00e \ x00 \ x00 \ x00'

cStringIO.StringIO (u'content типа '). GetValue (). закодировать (' UTF-8 '). декодировать (' UTF-8 '). декодировать (' UTF-32' )

u'content типа»

2 Solutions collect form web for “Python "\ x00" заполняется / utf-32 строка из cStringIO”

Основная причина в том, что cStringIO.StringIO(unicode_object) создает бессмысленность.

Текущие 2.X-документы на docs.python.org говорят

В отличие от модуля StringIO, этот модуль не может принимать строки Unicode, которые не могут быть закодированы как простые строки ASCII.

Это бесполезно и неверно; Смотри ниже. Версия chm документации, поставляемой с установщиком win32 для CPython 2.7.2 и 2.6.6, следует за этим предложением:

Вызов StringIO () с параметром строки Unicode заполняет объект буфером представления строки Unicode вместо кодирования строки.

Это правильное описание поведения (см. Ниже). Поведение не блестящее. Я не могу представить, что хорошая причина для удаления этого предложения из веб-документов.

Поступать плохо:

 Python 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win32 >>> import StringIO, cStringIO, sys >>> StringIO.StringIO(u"fubar").getvalue() u'fubar' <<=== unicode object >>> cStringIO.StringIO(u"fubar").getvalue() 'f\x00u\x00b\x00a\x00r\x00' <<=== str object cStringIO.StringIO(u"\u0405\u0406").getvalue() '\x05\x04\x06\x04' <<=== "accepts" >>> sys.maxunicode 65535 # your sender presumably emits 1114111 (wide unicode) >>> sys.byteorder 'little' 

Таким образом, в общем, все, что нужно сделать, это знать / угадывать контурность и юникод-ширину Python отправителя и декодировать беспорядок с помощью UTF-(16|32)-(B|L)E

В вашем случае отправитель скорее византийский; например, u'content-length'.encode('utf-8') является str объектом 'content-length' который имеет замечательное сходство с тем, с чего вы начали. Также foo.encode(utf8').decode('utf8') создает либо foo либо исключение.

Что-то на этом пути кодирует ваши значения как UTF-32. Просто расшифруйте их:

 >>> b = u"c\x00\x00\x00o\x00\x00\x00n\x00\x00\x00t\x00\x00\x00e\x00\x00\x00\ ... n\x00\x00\x00t\x00\x00\x00-\x00\x00\x00l\x00\x00\x00e\x00\x00\x00\ ... n\x00\x00\x00g\x00\x00\x00t\x00\x00\x00h\x00\x00\x00" >>> b.decode('utf-32') u'content-length' 
Python - лучший язык программирования в мире.