首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python字节字符串编码和解码

问python字节字符串编码和解码
EN

Stack Overflow用户
提问于 2012-03-07 23:54:15
回答 3查看 31K关注 0票数 10

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

代码语言:javascript
复制
b = '\x80'
u8 = b.encode('utf-8')
j = json.dumps(u8)

我希望j是'\xc2\x80‘,但我得到的结果是:

代码语言:javascript
复制
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)

EN

回答 3

Stack Overflow用户

发布于 2012-03-08 00:07:21

您需要检查您正在使用的软件API的文档。BLOB是一个缩写:BINARY Large Object。

如果您的数据实际上是二进制的,那么将其解码为Unicode的想法当然是无稽之谈。

如果它实际上是文本,您需要知道使用什么编码将其解码为Unicode。

然后使用json.dumps(a_Python_object) ..。如果您自己将其编码为UTF-8,json会再次解码:

代码语言:javascript
复制
>>> 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“和”不引发异常“。

票数 9
EN

Stack Overflow用户

发布于 2012-03-07 23:57:30

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

代码语言:javascript
复制
In [123]: 'foo'.decode('latin-1')
Out[123]: u'foo'
票数 6
EN

Stack Overflow用户

发布于 2012-03-08 00:10:15

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

代码语言:javascript
复制
unicode_b = b.decode('some_encoding')

然后使用utf_8编码将unicode对象重新编码回字符串对象。

代码语言:javascript
复制
b = unicode_b.encode('utf_8')

使用unicode对象作为翻译器,不知道字符串的原始编码是什么,我就不能确定,但有可能转换不会像预期的那样进行。unicode对象不用于将一种编码的字符串转换为另一种编码。我将使用unicode对象,假设您知道编码是什么,如果您不知道编码是什么,那么就没有办法在不反复试验的情况下找出答案,然后当您想要回string对象时,再将其转换回编码的字符串。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9604747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档