Python编码格式
Python encoding format
我需要将 python str
存储在数据库中以检索它,然后在其上应用 format()
和 encode()
方法以塑造我的请求帧将其转换为 bytes
,最后通过 socket
.
send()
MWE是这样的:
fstr = '{slaveid:}{command:s}\x0d'
cstr = fstr.format(slaveid=chr(128+43), command='flags')
bstr = cstr.encode()
并产生以下输出:
{slaveid:}{command:s}
«flags
b'\xc2\xabflags\r'
我的问题出现在第三行,大于127的字符在执行encode()
方法时变成了两个字节。假设这都是关于字符集定义的,因为默认编码 'ascii'
被限制为 127.
我应该如何定义我的编码以获得以下转换:
b'\xabflags\r'
在charset tables面前有点迷茫。
如问题评论中所述,问题是 .encode()
方法默认将字符串编码为 UTF-8 的结果。 chr(128+43)
插入的字符是\u00ab
,UTF-8编码为两个字节:\xc2\xab
.
解决方法是在调用.encode()
时指定一个single-byte字符编码。以下任何一项都有效...
cstr.encode(encoding='latin_1')
cstr.encode(encoding='iso-8859-1')
cstr.encode(encoding='cp1252')
...虽然应该注意虽然 iso-8859-1
只是 latin_1
的别名,但 cp1252
和 latin_1
不是 同样的事情。但是,在您的情况下,这无关紧要,因为实际的 "character" 并不重要,只是 range(256)
.
中的(单个)字节值
我需要将 python str
存储在数据库中以检索它,然后在其上应用 format()
和 encode()
方法以塑造我的请求帧将其转换为 bytes
,最后通过 socket
.
send()
MWE是这样的:
fstr = '{slaveid:}{command:s}\x0d'
cstr = fstr.format(slaveid=chr(128+43), command='flags')
bstr = cstr.encode()
并产生以下输出:
{slaveid:}{command:s}
«flags
b'\xc2\xabflags\r'
我的问题出现在第三行,大于127的字符在执行encode()
方法时变成了两个字节。假设这都是关于字符集定义的,因为默认编码 'ascii'
被限制为 127.
我应该如何定义我的编码以获得以下转换:
b'\xabflags\r'
在charset tables面前有点迷茫。
如问题评论中所述,问题是 .encode()
方法默认将字符串编码为 UTF-8 的结果。 chr(128+43)
插入的字符是\u00ab
,UTF-8编码为两个字节:\xc2\xab
.
解决方法是在调用.encode()
时指定一个single-byte字符编码。以下任何一项都有效...
cstr.encode(encoding='latin_1')
cstr.encode(encoding='iso-8859-1')
cstr.encode(encoding='cp1252')
...虽然应该注意虽然 iso-8859-1
只是 latin_1
的别名,但 cp1252
和 latin_1
不是 同样的事情。但是,在您的情况下,这无关紧要,因为实际的 "character" 并不重要,只是 range(256)
.