【问题标题】:Python Conversion from int to Windows-1252从 int 到 Windows-1252 的 Python 转换
【发布时间】:2015-03-09 22:58:02
【问题描述】:

我目前正在编写一个从串行端口读取数据的程序,添加一些头信息,然后将这些数据写入 .jpg 文件。

我需要以 Windows-1252 编码格式写入文件,是的,我构造数据和标题的方法是十六进制格式。

在比较应该写的图片和实际写的图片时,我意识到我的问题,并看到 DOULBE LOW 9 QUOTES 不是写成引号而是写成零。

该符号的十进制代码是132 (0x84)。如果我使用 chr(0x84) 我会收到以下错误

UnicodeEncodeError:“charmap”编解码器无法在位置 0 编码字符 \x84:字符映射到

这只有在 chr() 试图映射到 Latin-1 代码集时才有意义。我试图将 int 转换为 unicode,但根据我的研究,chr 是唯一可以做到这一点的函数。

我也尝试在 python 中使用struct 包。

import struct
a = 123;
b = struct.pack("c",a)
print(b)

我得到了错误

Traceback(最近一次调用最后一次):文件“python”,第 3 行,在 struct.error: char 格式需要长度为 1 的字节对象

阅读过去的问题、答案和文档确实会让人感到困惑,因为混合了 python2 和 python3 的答案以及转换为 ascii 的人(这显然行不通)。

我在 Windows 7 机器上使用 Python 3.4.3(最新版本)。

【问题讨论】:

  • 你试过使用struct模块吗? docs.python.org/2/library/struct.html
  • @danielfranca 是的,我有。将用我对 struct 的尝试更新问题。
  • 试试a = bytes([123])。我得到的结果是b'{'
  • @martineau 试试 bytes([132]),你得到了什么?
  • 如果我之后print(a),我得到b'\x84',并且0x84 == 132(并且a[0]也是132)。

标签: python


【解决方案1】:

UnicodeEncodeError: 'charmap' codec can't encode character \x84

\x84 是 Windows-1252 中低引号字符的编码。这表明您的数据已经编码,您不应再次尝试对其进行编码。在文本字符串中,引号应显示为"\u201E""\u0084"chr(132) 的结果)实际上是一个control character

你应该有可以解码成字符串的字节:

>>> b"\x84".decode('windows-1252')
'\u201e'

或者您应该有一个文本字符串,您可以将其编码为字节字符串

>>> "\u201e".encode('windows-1252')
b'\x84'

如果你从某个地方读取数据,你可以像这样使用struct 模块

# suppose we download some data:
data=b'*\x00\x00\x00abcde'

a, txt = struct.unpack("I5s", data)
print(txt.decode('windows-1252'))

【讨论】:

  • 我可以保证它还不是字节。我实际上是在做 chr(132),仅此而已。
  • @LanceHenderson chr(132) 无法使用 windows-1252 进行编码。 DOUBLE LOW-9 QUOTATION MARK 的 Unicode 代码点为 0x210E,因此获取此字符的代码为 chr(0x210E)chr(8462)。 132 是使用 windows-1252 对该字符的编码。
猜你喜欢
  • 2021-04-09
  • 1970-01-01
  • 2013-09-10
  • 1970-01-01
  • 1970-01-01
  • 2010-10-09
  • 2014-05-06
  • 2013-04-14
  • 2011-05-20
相关资源
最近更新 更多