【发布时间】:2018-05-24 06:56:47
【问题描述】:
在 Python 3 中,使用 socket.recv() 从硬件获取数据,并获取字节:b'\x00\x004\x00\x08\x00\x00\x00The Delta Wavelength (nm) is currently set to 0.008.\xfc\xa9\xf1\xd2Mb\x80?'
如何将上述内容解码为 str(或 unicode)'\x00\x004\x00\x08\x00\x00\x00The Delta Wavelength (nm) is currently set to 0.008.\xfc\xa9\xf1\xd2Mb\x80?'?尝试了“ascii”、“latin-1”、“utf-8”。没有任何作用。
在 Python 2.7 中,b'\x00\x004\x00\x08\x00\x00\x00The Delta Wavelength (nm) is currently set to 0.008.\xfc\xa9\xf1\xd2Mb\x80?'.decode('latin-1') 有效,并获得 unicode u'\x00\x004\x00\x08\x00\x00\x00The Delta Wavelength (nm) is currently set to 0.008.\xfc\xa9\xf1\xd2Mb\x80?'。 ascii, utf-8 也不行。
附言我正在将 Python 2.7 代码转换为 Python 3.6
【问题讨论】:
-
b'\x00...'.decode('latin-1')为我工作并提供所需的输出。 Latin-1 总是“有效”解码字节序列,因为一个字节的所有 256 种可能状态都可以由 Latin-1 解释。它在哪些方面对您不起作用? -
它在 python 3.6 中有效吗?我得到了 '\x00\x004\x00\x08\x00\x00\x00The Delta Wavelength (nm) current set to 0.008.ü©ñÒMb\x80?',在 0.008 之后都搞砸了
-
不,是一样的。检查
'\xfc\xa9\xf1\xd2Mb\x80?' == 'ü©ñÒMb\x80?'的输出 -
谢谢@lenz,为什么它显示的如此不同?
-
您可以插入任何带有反斜杠符号的字符,例如。
'\x41' == 'A'。在repr()表单中,不可打印的字符(控制字符和大多数空格)以反斜杠转义显示——就像你看到的'\n',但字符串包含一个实际的换行符,而不是“\”和“n”。在 Python 2 中,高于 127 的代码点(如“ü”)被视为不可打印;这已在 Python 3 中被删除,这就是您在此处看到的区别。
标签: string python-3.x unicode