Python从struct.unpack()的输出解码UTF-16

时间:2015-02-08 08:39:30

标签: python python-2.7 utf-16

我无法弄清楚我在哪里出错了。

这是我尝试解码的数据。

('2','\x00','2','\x00','5','\x00','0','\x00',
 'P','\x00','i','\x00','n','\x00','O','\x00','V','\x00',
 'E','\x00','m','\x00','p','\x00','t','\x00','y','\x00')

这是一段代码:

s = bytes(struct.unpack('28c',fld_desc)).decode('utf-16')

而不是获取字符串'2250PinOVEmpty',我得到了这个......非常奇怪的符号串:

⠧㈧Ⱐ❜砰〧Ⱐ✲✬‧屸〰✬‧㔧Ⱐ❜砰〧Ⱐ✰✬‧屸〰✬‧倧Ⱐ❜砰〧Ⱐ❩✬‧屸〰✬‧渧Ⱐ❜砰〧Ⱐ❏✬‧屸〰✬‧嘧Ⱐ❜砰〧Ⱐ❅✬‧屸〰✬‧洧Ⱐ❜砰〧Ⱐ❰✬‧屸〰✬‧琧Ⱐ❜砰〧Ⱐ❹✬‧屸〰✩

我哪里出错了?

2 个答案:

答案 0 :(得分:3)

加入这些字符,然后对其进行解码:

>>> data = ('2','\x00','2','\x00','5','\x00','0','\x00',
...         'P','\x00','i','\x00','n','\x00','O','\x00','V','\x00',
...         'E','\x00','m','\x00','p','\x00','t','\x00','y','\x00')
>>> ''.join(data).decode('utf-16')
u'2250PinOVEmpty'

答案 1 :(得分:3)

如果你的fld_desc确实只是字节字符串'2\x002\x005\x000\x00P\x00i\x00n\x00O\x00V\x00E\x00m\x00p\x00t\x00y\x00'而且这是python 2,你只需要做

>>> fld_desc.decode('UTF-16-LE')
u'2250PinOVEmpty'

你出错的地方是你需要在这里使用struct.unpack。如果你这样做,那么你必须注意struct.unpack返回一个字符元组:

>>> struct.unpack(fld_desc)
('2', '\x00', '2', '\x00', '5', '\x00', '0', '\x00', 'P', '\x00', 'i', '\x00', 
 'n', '\x00', 'O', '\x00', 'V', '\x00', 'E', '\x00', 'm', '\x00', 'p', '\x00', 
 't', '\x00', 'y', '\x00')

bytes为基础(毕竟它是python 2中str的同义词),使其成为一个新的字符串

"('2', '\\x00', '2', '\\x00', '5', '\\x00', '0', '\\x00', 'P', '\\x00', 'i', '\\x00', 'n', '\\x00', 'O', '\\x00', 'V', '\\x00', 'E', '\\x00', 'm', '\\x00', 'p', '\\x00', 't', '\\x00', 'y', '\\x00')"

哪个解码看起来大部分是CJK字符串和象形图

  

“✨✲尧へ✰㈧Ⱗ✠硁〰Ⱗ✠✵尧へ✰〧Ⱗ✠硁〰Ⱗ✠❐尧へ✰椧Ⱗ✠硁〰Ⱗ✠❮尧へ✰伧Ⱗ✠硁〰Ⱗ✠❖尧へ✰Ⱗ✠硁〰Ⱗ✠❭尧尧泷泷Ⱗ✠硁尧尧尧✰礧〰⤧〰⤧〰⤧〰⤧“

以小端(UTF-16-LE)和

  

“⠧㈧Ⱐ❜砰〧Ⱐ✲✬‧屸〰✬‧㔧Ⱐ❜砰〧Ⱐ✰✬‧屸〰✬‧倧Ⱐ❜砰〧Ⱐ❩✬‧屸〰✬‧渧Ⱐ❜砰〧Ⱐ❏ ✬‧屸屸‧嘧Ⱐ❜砰屸屸洧洧洧砰砰屸屸琧琧琧琧Ⱐ❜砰砰屸〰✩<<“

大端(UTF-16-BE)。