python - 为什么 Python 的 .decode ('cp037' ) 不适用于特定的二进制数组?

标签 python binary byte arrays ibm-midrange

当打印出 DB2 查询结果时,我在二进制数组“F00002”列上收到以下错误。

UnicodeEncodeError: 'ascii' codec can't encode character u'\xe3' in position 2: ordinal not in range(128)

我正在使用以下行:

打印结果[2].decode('cp037')

...就像我在前两列中所做的一样,相同的代码工作正常。为什么这不适用于第三列,什么是正确的解码/编码?

enter image description here enter image description here

最佳答案

请注意错误是关于编码到ASCII,而不是关于从cp307解码。但是您并没有要求它在任何地方进行编码,那么为什么会这样呢?

好吧,实际上有两个地方可能会出错,如果没有您的帮助,我们无法知道是哪一个。


首先,如果您的 result[2]已经是 unicode对象,调用 decode('cp037')它会首先尝试encode它与 sys.getdefaultencoding() , 通常是 'ascii' ,所以它有一些东西要解码。因此,您不会收到“嘿,笨蛋,我已经解码了”的错误消息,而是会收到有关编码为 ASCII 失败的错误消息。 (这可能看起来很愚蠢,但它对于少数可以解码 unicode -> unicodeunicode -> str 的编解码器很有用,例如 ROT13 和 quoted-printable。)

如果这是您的问题,解决方案是不调用 decode .到目前为止,您大概已经在某个地方解码了数据,所以不要再尝试这样做。 (如果你对其解码错误,你需要弄清楚你在哪里解码它并修复它以正确完成它;在它已经错误之后重新解码它无济于事。)


其次,将 Unicode 字符串传递给 print会自动尝试encode它与(取决于您的 Python 版本)sys.getdefaultencoding()sys.stdout.encoding .如果 Python 未能为您的控制台猜出正确的编码(在 Windows 上很常见),或者如果您将脚本的标准输出重定向到一个文件而不是打印到控制台(这意味着 Python 不可能猜出正确的编码) , 你可以得到 'ascii'即使在 sys.stdout.encoding .

如果这是你的问题,你必须为你的控制台明确指定正确的编码(如果你幸运的话,它在 sys.stdout.encoding 中),或者你想要重定向到的文本文件的编码(可能'utf-8' ,但这取决于您),并且明确地 encode你的一切print .


那么,你怎么知道它是哪一个呢?

简单。 print type(result[2])看看它是不是 unicodestr .或者把它分成两部分:x = result[2].decode('cp037')然后 print x ,看看两个加注中的哪一个。或者在调试器中运行。你有各种各样的选项来调试它,但你必须做一些事情。

当然也有可能,一旦你修复了第一个,你就会立即遇到第二个。但现在您知道如何处理它了。


另外,请注意 cp037 是 EBCDIC,这是 Python 所知道的少数几种 ASCII 兼容的编码之一。事实上,'\xe3'是字母 T 的 EBCDIC .

关于python - 为什么 Python 的 .decode ('cp037' ) 不适用于特定的二进制数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20530731/

相关文章:

vb.net - 在VB.Net中将字节数组转换为整数

Java - 字节流与字符流?

python - 2向量矩阵点积的性能

python - 在 Tkinter 中使用 Spritesheet

linux - 如何在终端上将二进制文本转换为 ASCII?

javascript - 如何区分二进制和十六进制值

python - 在Python中重命名所有文件的名称

python - 如何使用 Python PPTX 将上标/下标文本添加到 Powerpoint?

java - 在Java中编写函数以查找正整数N的二进制周期

c - 从 C 中的无符号整数打印一个字节