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

Python decoding UTF-16 from output of struct.unpack()

我不知道我哪里做错了。

这是我要解码的数据。

('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',而是得到了这个...非常奇怪的符号串:

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

我哪里错了?

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

>>> 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'

如果你的 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 returns 一个字符元组:

>>> 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)。