我目前正在编写一个程序,从串口读取数据会添加一些标题信息,然后将这些数据写入.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行,in struct.error:char格式需要一个长度为1的字节对象
阅读过去的问题,答案和文档确实会让人感到困惑,因为混合使用python2和python3的答案与人们转换为ascii(显然无效)。
我在Windows 7计算机上使用Python 3.4.3(最新版本)。
答案 0 :(得分: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'))