如果我有一个 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 中提取的正确整数值。有什么方法可以做到这一点吗?
最佳答案
Normally, the device sends back something like: \x00\x00\x03\xcc which I can easily convert to 972
好的,所以我认为这里发生的事情是您尝试从面向字节的设备读取四个字节,并将其解码为整数,将字节解释为大端顺序的 32 位字。
为此,使用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
通过使用相同的映射将编码回字节来逆转不正确的解码步骤是可能的,但这是冒险的,并且取决于所涉及的编码(并非所有字节都映射到所有编码中可用的任何内容)。更好的做法是查看输入的来源,找到解码步骤发生的位置,然后删除它,这样您就可以保留设备发送给您的原始字节。
关于python - 将 UTF-8 字符串转换为 Python 中的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35137266/