我正在尝试将包含非ascii字符的传入字节字符串转换为有效的utf-8字符串,以便我可以将其转储为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‘是通过google协议缓冲区从mysql传入的,并由一些blob数据填充。
有什么想法吗?
编辑:我将以太网帧作为blob存储在mysql表中(请大家关注主题,不要讨论为什么表中有数据包)。表排序是utf-8,并且db层(sqlalchemy,非orm)正在抓取数据并创建结构(google协议缓冲区),该结构将blob存储为python 'str‘。在某些情况下,我直接使用协议缓冲区,没有任何问题。在其他情况下,我需要通过json公开相同的数据。我注意到的是,当json.dumps()执行它的操作时,'\x80‘可以替换为无效的unicode char (\ufffd iirc)
发布于 2012-03-08 00:07:21
您需要检查您正在使用的软件API的文档。BLOB是一个缩写:BINARY Large Object。
如果您的数据实际上是二进制的,那么将其解码为Unicode的想法当然是无稽之谈。
如果它实际上是文本,您需要知道使用什么编码将其解码为Unicode。
然后使用json.dumps(a_Python_object) ..。如果您自己将其编码为UTF-8,json会再次解码:
>>> import json
>>> json.dumps(u"\u0100\u0404")
'"\\u0100\\u0404"'
>>> json.dumps(u"\u0100\u0404".encode('utf8'))
'"\\u0100\\u0404"'
>>>关于latin1的更新
u'\x80'是一个无用的、毫无意义的C1控制字符--其编码极不可能是拉丁文-1。拉丁-1是“陷阱和错觉”--所有8位字节都被解码为Unicode,而不会引发异常。不要混淆"works“和”不引发异常“。
发布于 2012-03-07 23:57:30
使用b.decode('name of source encoding')获取unicode版本。当我学到这一点时,我感到很惊讶。例如:
In [123]: 'foo'.decode('latin-1')
Out[123]: u'foo'发布于 2012-03-08 00:10:15
我认为你要做的就是解码一些编码的字符串对象。你知道那个编码是什么吗?来获取unicode对象。
unicode_b = b.decode('some_encoding')然后使用utf_8编码将unicode对象重新编码回字符串对象。
b = unicode_b.encode('utf_8')使用unicode对象作为翻译器,不知道字符串的原始编码是什么,我就不能确定,但有可能转换不会像预期的那样进行。unicode对象不用于将一种编码的字符串转换为另一种编码。我将使用unicode对象,假设您知道编码是什么,如果您不知道编码是什么,那么就没有办法在不反复试验的情况下找出答案,然后当您想要回string对象时,再将其转换回编码的字符串。
https://stackoverflow.com/questions/9604747
复制相似问题