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

时间:2015-02-17 09:19:27

标签: linux python-2.7 raspberry-pi latin1 utf8-decode

尝试使用Raspberry Pi进行一些逆向工程。我正在将Can Analyzer的输出传递给python脚本。我的主要问题是“扩展的”ascii字符最终没有正确显示。

我按如下方式运行脚本:

./candump blablabla | python test.py

./candump的结果是'十六进制'字符串,例如“3631B043”在这种情况下应转换为“61°C”。由于我正在进行逆向工程,我不知道所使用的编码,我只知道只有1个字节用于度符号(“B0”)。 “ü”符号(“FC”)的情况也是如此。

当我在pi上的python中尝试一些事情(经过google搜索之后)后,我终于成功获得了正确的格式。但是我不知道它是如何工作的,当我在我的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
>>>

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

1 个答案:

答案 0 :(得分:1)

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

第一个decode将十六进制解码为字节。第二个decode使用Latin-1(也称为ISO-8859-1)从字节转换为Unicode。此时,您有一个正确的Unicode字符串,如果您愿意,可以进一步编码为不同的编码。

相关问题