2011-02-23 96 views
1

在这里可用的所有编码http://docs.python.org/library/codecs.html 哪一个是我应该用于将二进制数据解码为unicode,而不会在编码回字符串时被破坏的一个?二进制数据到Unicode

我用raw_unicode_data和它不工作。

例:I在POST上载图像(但不作为文件附件)。 Django使用utf-8将POST数据转换为unicode。但是,当从unicode转换回字符串(再次使用utf-8)时,数据将被损坏。我使用raw_unicode_data并且发生了同样的情况(尽管这次只有几个字节)。我应该使用哪种编码,以便解码和编码步骤不会破坏数据。

+5

“二进制数据”?请定义你的意思,提供一个例子,甚至可能提供你用来读取,检索或构建这个东西的代码。 – 2011-02-23 18:01:18

+2

这个例子似乎不可信。 bytes_representing_a_picture.decode(“utf-8”),是注定要失败,99.9% - 当然,除非如果Django使用了“忽略”或“替换”选项(aarrgghh) – 2011-02-24 01:02:16

+0

@约翰 - 事实上它失败。 – 2011-02-25 14:42:52

回答

3

“二进制数据”不是文本,因此将其转换为unicode是毫无意义的。如果在二进制数据中嵌入了文本,则先提取它,然后使用数据格式规范中给出的编码进行解码。

+5

二进制数据可以表示任何内容。它可以是可以解码Unicode的“字节”。 – 2011-02-23 18:09:06

+0

@ S.Lott:如果提取过程只是按照原样使用整个事物,那就这样吧。但我支持我的回答。 – 2011-02-23 18:14:08

+0

你应该支持你的答案。但是,您也可以考虑将其扩展到涵盖从文件中获取二进制数据的最常见情况。 – 2011-02-23 18:45:42

1

正如其他人已经说过,你的问题还不是特别清楚。如果您想要通过文本通道(如POST)获取二进制数据,那么base64是正确的格式,可用于客户端和服务器中的适当数据转换操作(二进制数据 - > base64文本 - >通过文本通道 - > base64文本 - >二进制数据)。如果你想忍受不正确的编码文本(例如Python 3试图为文件路径和环境变量等界面所做的尝试),那么Python 3.1和更高版本会提供surrogatescape错误处理程序,它会将无效值转换为无效可读文本的格式,但允许在编码回字节时忠实地重新创建原始二进制数据。

+1

问题不在于POST是文本通道,因为它不是。事实上,服务器会毫无怨言地将所有内容都放到Content-Length上。我猜OP面临的问题是他试图在POST **字段**中上传二进制文件,而字段解析器(mod_wsgi或Django或其他)在二进制文件中找到&符号时会窒息。正如你和我建议base64应该解决它。 – 2011-02-25 13:29:38