python字节字符串编码和解码

2024-05-09 21:10:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将包含非ascii字符的传入字节字符串转换为有效的utf-8字符串,以便可以将is转储为json。

b = '\x80'
u8 = b.encode('utf-8')
j = json.dumps(u8)

我希望j是'\xc2\x80',但是我得到了:

UnicodeDecodeError: 'ascii' codec can't decode byte 0x80 in position 0: ordinal not in range(128)

在我的情况下,“b”来自mysql,通过google协议缓冲区,并由一些blob数据填充。

有什么想法吗?

编辑: 我有以太网帧作为blob存储在一个mysql表中(请大家注意,不要讨论表中为什么有数据包)。表排序规则是utf-8,db层(sqlalchemy,non-orm)正在获取数据并创建结构(google protocol buffers),将blob存储为python“str”。在某些情况下,我直接使用协议缓冲区而没有任何问题。在其他情况下,我需要通过json公开相同的数据。我注意到,当json.dumps()执行其操作时,'\x80'可以替换为无效的unicode字符(\ufffd iirc)


Tags: 字符串injson协议googleasciimysql情况
2条回答

我想你要做的是解码一些编码的字符串对象。你知道那个编码是什么吗?以获取unicode对象。

unicode_b = b.decode('some_encoding')

然后使用utf_8编码将unicode对象重新编码回string对象。

b = unicode_b.encode('utf_8')

使用unicode对象作为转换程序,不知道字符串的原始编码是什么,我无法确定,但有可能转换不会如预期的那样进行。unicode对象不用于将一种编码的字符串转换为另一种编码。我将使用unicode对象,假设您知道编码是什么,如果您不知道编码是什么,那么真的没有办法不经尝试和错误地找出答案,然后在您想要返回字符串对象时转换回编码的字符串。

使用b.decode('name of source encoding')获取unicode版本。当我学会这一点时,我感到很惊讶。例如:

In [123]: 'foo'.decode('latin-1')
Out[123]: u'foo'

相关问题 更多 >