编码/解码 python 2.7 中的特殊字符

encoding / decoding special characters in python 2.7

正在尝试使用 Raspberry Pi 进行一些逆向工程。我将 Can Analyzer 的输出通过管道传输到 python 脚本。我的主要问题是 'extended' ascii 字符最终没有正确显示。

我运行脚本如下:

./candump blablabla | python test.py

./candump 的结果是一个 'hex' 字符串,例如在这种情况下,“3631B043”应翻译为“61°C”。由于我是做逆向工程的,所以不知道使用的编码方式,只知道度数符号只用了1个字节("B0")。 “ü”符号也是如此("FC")。

当我在 pi 上的 python 中尝试一些东西时(在谷歌搜索了很多之后)我终于成功地获得了正确的格式。但是我不知道它是如何工作的,当我在 python 脚本中尝试同样的操作时它不再工作了。 这是尝试:

pi@raspberrypi /test/cant/can-test $ python
Python 2.7.3 (default, Mar 18 2014, 05:13:23)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> input = "3631B043"
>>> hex = input.decode("hex")
>>> len(hex)
4
>>> print hex
61▒C
>>> print hex.encode('utf8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xb0 in position 2: ordinal not in range(128)
>>> import sys
>>> reload(sys)
<module 'sys' (built-in)>
>>> print hex.encode('utf8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xb0 in position 2: ordinal not in range(128)
>>> sys.setdefaultencoding('latin1')
>>> print hex.encode('utf8')
61°C
>>>

有人可以解释这背后的原因以及为什么在使用管道时此选项不再起作用。 谢谢

>>> print '3631B043'.decode('hex').decode('iso-8859-1')
61°C

第一个 decode 将十六进制解码为字节。第二个 decode 使用 Latin-1(又名 ISO-8859-1)从字节转换为 Unicode。在这一点上,你有一个适当的 Unicode 字符串,如果你愿意,可以进一步编码成不同的编码。