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

在Python中将UTF-8字符串转换为字符串,python,unicode,Python,Unicode,如果我有一个unicode字符串,例如: s = u'c\r\x8f\x02\x00\x00\x02\u201d' 如何将其转换为非unicode格式的常规字符串;i、 e.我想摘录: f = '\x00\x00\x02\u201d' 我不想要unicode格式的。我之所以需要这样做,是因为我需要将s中的unicode转换为整数值,但如果我仅使用s进行尝试: int((s[-4]+s[-3]+s[-2]+s[-1]).encode('hex'), 16) Traceback (most r

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

s = u'c\r\x8f\x02\x00\x00\x02\u201d'
如何将其转换为非unicode格式的常规字符串;i、 e.我想摘录:

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)
这是我想从s中提取的正确整数值。有什么方法可以让我做到这一点吗

通常情况下,设备会发回:\x00\x00\x03\xcc之类的信息,我可以轻松地将其转换为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

通过使用相同的映射将代码编码回字节,可能会逆转错误的解码步骤,但这是不确定的,取决于所涉及的编码(并非所有字节都映射到所有编码中可用的任何内容)。最好是查看输入来自何处,找到解码步骤发生在何处,并将其删除,以便保留设备发送给您的原始字节。

如果您希望字符
\u201d
在其中,则根据定义,您需要Unicode字符串。您应该检查您的需求,并可能用明确的问题陈述更新您的问题。为什么要放弃
c\r\x8f\x02
?另外,
s
不是UTF-8,ByTestString文本中的
\u201d
会产生一个实际的反斜杠和字符
u201d
,因此如果您真的想要这个结果(664608376369508L似乎表示您需要),您会想到一个非常奇怪的转换。也许你在上游某个地方把数据弄乱了,你应该在那里修复它。我不完全理解
\u201d
字符是什么。此协议与发送回
s
的设备通信。在
s
中,只有
f
中列出的内容包含数据。我需要把
f
解码成一个整数。(列出的664608376369508L I不正确)。通常情况下,设备会发回类似的信息:
\x00\x00\x03\xcc
,我可以很容易地将其转换为
972
,但当我收到类似信息:
\u201d
或类似信息时,我不知道如何处理。好的,我会详细了解设备是如何发回字节的,以及我是否可以获得原始字节。非常感谢。
>>> struct.unpack('>i', '\x00\x00\x02\x94')[0]
660