python - 将 UTF-8 字符串转换为 Python 中的字符串

标签 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 中提取的正确整数值。有什么方法可以做到这一点吗?

最佳答案

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/

相关文章:

python - 将 QMimeData 粘贴到另一个窗口的 QTextEdit

regex - OCaml:如何从字符串中删除所有非字母字符?

python - 如何在 pytables 中创建可以存储 Unicode 字符串的压缩数据集?

ios - UISearchBar 输入字符串转义 unicode 字符

python - pandas python 中没有名为 read_csv 的属性

python - 如何从 Python 编写 Visual Studio 2008 脚本?

python - Divio云部署错误: ENOGIT git is not installed or not in the PATH

python - SAS 访问 blob 容器 (azure/python)

golang 中的字符串转换和 Unicode

javascript - 使用 PHP 解码回 Javascript base64 unicode