linux - 在 python 2.7 中编码/解码特殊字符

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

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

我按如下方式运行脚本:

./candump blablabla | python test.py

./candump 的结果是一个“十六进制”字符串,例如在这种情况下,“3631B043”应翻译为“61°C”。由于我在做逆向工程,我不知道使用的编码,我只知道度数符号(“B0”)只使用了 1 个字节。 “ü”符号(“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 字符串,如果您愿意,可以将其进一步编码为不同的编码。

关于linux - 在 python 2.7 中编码/解码特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28558424/

相关文章:

c - 如何捕捉pointermotion事件,将指针限制在一个区域内?

python - 如何将模块从一个 python 文件导入到另一个 python 文件?

javascript - 仅匹配完整数字正则表达式

linux - 在 Raspberry Pi 上重新映射键盘时出现问题

java - 覆盆子中 jaydebeapi 的问题类路径

raspberry-pi - Electron - Linux - 黑屏

linux - 按bash中的多列排序

linux - 如何保持 Elasticsearch 在linux服务器上运行

c - Linux 中的 malloc 错误,相同的代码在 Mac OS X 上运行良好

python-2.7 - 在NLTK中使用我自己的语料库而不是movie_reviews语料库进行分类