将UTF-8字符串转换为Python

时间:2016-02-01 18:01:15

标签: python unicode

如果我有一个unicode字符串,例如:

s = u'c\r\x8f\x02\x00\x00\x02\u201d'

如何将其转换为非unicode格式的常规字符串;即我想提取:

f = '\x00\x00\x02\u201d'

我不希望它采用unicode格式。我需要这样做的原因是因为我需要将s中的unicode转换为整数值,但是如果我只用s来尝试它:

int((s[-4]+s[-3]+s[-2]+s[-1]).encode('hex'), 16)

Traceback (most recent call last):
  File "<pyshell#48>", line 1, in <module>
    int((s[-4]+s[-3]+s[-2]+s[-1]).encode('hex'), 16)
  File "C:\Python27\lib\encodings\hex_codec.py", line 24, in hex_encode
    output = binascii.b2a_hex(input)
UnicodeEncodeError: 'ascii' codec can't encode character u'\u201d' in position 3: ordinal not in range(128)

如果我用f:

这样做的话
int(f.encode('hex'), 16)
664608376369508L

这是我想从s中提取的正确整数值。有没有办法可以做到这一点?

1 个答案:

答案 0 :(得分:2)

  

通常情况下,设备会发回如下内容:\ x00 \ x00 \ x03 \ xcc,我可以轻松转换为972

好的,所以我认为这里发生的事情是你试图从面向字节的设备读取四个字节,并将其解码为整数,将字节解释为big-endian顺序的32位字。 / p>

为此,请使用struct模块和字节字符串:

>>> struct.unpack('>i', '\x00\x00\x03\xCC')[0]
972

(我不确定你为什么试图反转字符串然后十六进制编码;这会使字节输入错误并输出太大的输出。)

我不知道你是如何从设备读取的,但在某些时候你已经将字节解码为文本(Unicode)字符串。从那里的U + 201D字符判断,我猜这个设备最初给你一个字节0x94,你用代码页1252或其他类似的Windows默认('ANSI')代码页解码它。

>>> struct.unpack('>i', '\x00\x00\x02\x94')[0]
660

有可能通过使用相同的映射编码回字节来反转不正确的解码步骤,但这很冒险并且取决于所涉及的编码(并非所有字节都映射到在所有编码中都可用的任何字节)。最好是查看输入的来源,找到解码步骤发生的位置,然后摆脱它,以便保持设备发送给你的原始字节。