python unicode错误转换为打印值

2024-09-27 09:28:14 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我有这样的unicode:

'\x00B\x007\x003\x007\x00-\x002\x00,\x001\x00P\x00W\x000\x000\x009\x00,\x00N\x00O\x00N\x00E\x00,\x00C\x00,\x005\x00,\x00J\x00,\x00J\x00,\x002\x009\x00,\x00G\x00A\x00R\x00Y\x00,\x00 \x00W\x00I\x00L\x00L\x00I\x00A\x00M\x00S\x00,\x00 \x00P\x00A\x00R\x00E\x00N\x00T\x00I\x00,\x00 \x00F\x00I\x00N\x00N\x00E\x00Y\x00 \x00&\x00 \x00L\x00E\x00W\x00I\x00S\x00,\x00U\x00S\x00,\x001\x00\r\x00'

它是从csv以字符串格式读入的,但我想把它转换成人类可读的格式。当我打印它时,它就可以工作了,但是我似乎无法找到使它以人类可读的形式保存到变量的approach命令。最好的方法是什么?在


Tags: x00x00ax00ix00sx00lx000x009x001
1条回答
网友
1楼 · 发布于 2024-09-27 09:28:14

你没有Unicode。还没有。您有一系列字节,这些字节使用UTF-16编码。您需要先解码这些字节:

data.decode('utf-16-be')

打印它只是因为您的控制台忽略了每个UTF-16代码单元的大端对。在

您的数据缺少一个Byte order mark,因此我使用了utf-16-be,或者是UTF-16的big-endian变体,假设您在正确的字节处剪切数据。如果你没有的话,它也可能是小的

实际上,我必须删除最后一个\x00空字节以使其解码;当您将一个UTF-16代码单元(每个2字节)切成两半时,您粘贴了一个奇数而不是偶数个字节:

^{pr2}$

读取的文件可能包含BOM作为前两个字节。如果是这样的话,只要告诉你用什么来读取这个数据就可以使用utf-16作为编解码器,它就会从第一个字节中找出正确的变体。在

如果您使用的是Python 2,那么您需要研究csv模块的Examples section,以获得能够以适合该模块的形式重新编码数据的代码;如果您包含该部分中的UnicodeReader,那么应该这样使用它:

with open(yourdatafile) as inputfile:
    reader = UnicodeReader(inputfile, encoding='utf-16')
    for row in reader:
        # row is now a list with unicode strings

演示:

>>> from StringIO import StringIO
>>> import codecs
>>> f = StringIO(codecs.BOM_UTF16_BE + s[:-1])
>>> r = UnicodeReader(f, encoding='utf-16')
>>> next(r)
[u'B737-2', u'1PW009', u'NONE', u'C', u'5', u'J', u'J', u'29', u'GARY', u' WILLIAMS', u' PARENTI', u' FINNEY & LEWIS', u'US', u'1']

如果您使用的是python3,只需将encoding参数设置为open()函数为utf-16,并按原样使用csv模块。在

相关问题 更多 >

    热门问题