通过另一个系统的cStringIO,我通过:
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\x00g\x00\x00\x00t\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'
False
把这个字符串转换成等价于u'content-type'
的字符串的最快、最便宜的方法是什么?我不能改变cStringIO
虽然philhag的回答是正确的,但问题似乎是:
StringIO.StringIO(u'content-type').getvalue().encode('utf-8')
'content-type'
StringIO.StringIO(u'content-type').getvalue().encode('utf-8').decode('utf-8')
u'content-type'
cStringIO.StringIO(u'content-type').getvalue().encode('utf-8').decode('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-type').getvalue().encode('utf-8').decode('utf-8').decode('utf-32')
u'content-type'
一路上有些东西把你的值编码成UTF-32。简单地解码它们:
根本原因是
cStringIO.StringIO(unicode_object)
产生了一个废话。docs.python.org上的current 2.X docs说
这是没有帮助和不正确的;见下文。win32安装程序为CPython 2.7.2和2.6.6提供的文档的
chm
版本如下:这是对行为的正确描述(见下文)。这种行为并不聪明。我无法想象从web文档中删除这句话的好理由。
行为不端:
所以一般来说,我们只需要知道/猜测发送者Python的endianness和unicode宽度,然后用
UTF-(16|32)-(B|L)E
解码混乱的内容。在您的例子中,发送者是相当拜占庭式的;例如
u'content-length'.encode('utf-8')
是str
对象'content-length'
,它与您开始使用的对象具有显著的相似性。同时,foo.encode(utf8').decode('utf8')
会产生foo
或异常。相关问题 更多 >
编程相关推荐