为什么Python';解码(';cp037';)在特定二进制数组上不工作?
打印DB2查询结果时,我在列“F00002”上遇到以下错误,该列是一个二进制数组为什么Python';解码(';cp037';)在特定二进制数组上不工作?,python,binary,byte,bytearray,ibm-midrange,Python,Binary,Byte,Bytearray,Ibm Midrange,打印DB2查询结果时,我在列“F00002”上遇到以下错误,该列是一个二进制数组 UnicodeEncodeError: 'ascii' codec can't encode character u'\xe3' in position 2: ordinal not in range(128) 我使用的是以下行: 打印结果[2]。解码('cp037') …就像我做的前两列一样,相同的代码可以很好地工作。为什么第三列不起作用,正确的解码/编码是什么 您的结果[2]似乎已经是unicode: &g
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe3' in position 2: ordinal not in range(128)
我使用的是以下行:
打印结果[2]。解码('cp037')
…就像我做的前两列一样,相同的代码可以很好地工作。为什么第三列不起作用,正确的解码/编码是什么
您的
结果[2]
似乎已经是unicode:
>>> u'\xe3'.decode('cp037')
Traceback (most recent call last):
...
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe3' in position 0: ordinal not in range(128)
>>> u'\xe3'.encode('cp037')
'F'
事实上,正如@abarnert在注释中指出的,在python 2.x中,为unicode对象调用decode分两步执行:
- 使用
编码为字符串sys.getdefaultencoding()
- 然后解码回unicode
>>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> u'\xe3'.encode('ascii').decode('cp037')
您得到的错误来自表达式的第一部分,
u'\xe3'.encode('ascii')
您的结果[2]
似乎已经是unicode:
>>> u'\xe3'.decode('cp037')
Traceback (most recent call last):
...
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe3' in position 0: ordinal not in range(128)
>>> u'\xe3'.encode('cp037')
'F'
事实上,正如@abarnert在注释中指出的,在python 2.x中,为unicode对象调用decode分两步执行:
- 使用
编码为字符串sys.getdefaultencoding()
- 然后解码回unicode
>>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> u'\xe3'.encode('ascii').decode('cp037')
您得到的错误来自表达式的第一部分,
u'\xe3'。encode('ascii')
注意,错误是关于编码为ascii,而不是关于从cp307解码。但是你没有要求它在任何地方编码,那么为什么会发生这种情况呢
实际上有两个地方可能会出错,如果没有你的帮助,我们无法知道是哪一个
首先,如果您的
结果[2]
已经是一个unicode
对象,在其上调用decode('cp037')
,将首先尝试使用sys.getdefaultencoding()
对其进行编码,这通常是'ascii'
,这样它就有东西要解码。因此,不是得到一个错误说“嘿,博佐,我已经解码了”,而是得到一个关于编码到ASCII失败的错误。(这可能看起来很愚蠢,但对于少数能够解码unicode
->unicode
或unicode
->str
的编解码器来说,这是非常有用的,比如ROT13和引用的printable。)
如果这是您的问题,解决方法是不要调用解码
。到目前为止,您可能已经在某个地方对数据进行了解码,所以不要再尝试这样做。(如果解码错误,则需要找出解码的位置并进行修复,以确保正确解码;如果解码错误,则重新解码也无济于事。)
其次,将Unicode字符串传递到print
将自动尝试使用sys.getdefaultencoding()
或sys.stdout.encoding
对其进行编码(取决于您的Python版本)。如果Python未能猜出控制台的正确编码(在Windows上非常常见),或者如果您将脚本的stdout重定向到一个文件而不是打印到控制台(这意味着Python不可能猜出正确的编码),那么即使在sys.stdout.encoding
中,您也可能会得到'ascii'
如果这是您的问题,您必须明确指定控制台的正确编码(如果幸运的话,它位于sys.stdout.encoding
),或者您要重定向到的文本文件的编码(可能是'utf-8'
,但这取决于您),并明确编码打印的所有内容
那么,你怎么知道这是哪一个呢
简单打印类型(结果[2])
并查看它是unicode
还是str
。或者将其分为两部分:x=result[2]。解码('cp037')
,然后打印x
,看看这两部分中的哪一个上升。或者在调试器中运行。您有各种各样的选项来调试它,但是您必须做一些事情
当然,也有可能,一旦你解决了第一个问题,你会立即遇到第二个问题。但现在你知道怎么处理了
另外,请注意,cp037是EBCDIC,Python知道的少数不兼容ASCII的编码之一。事实上,'\xe3'
是字母T
的EBCDIC请注意,错误是关于编码为ASCII,而不是从cp307解码。但是你没有要求它在任何地方编码,那么为什么会发生这种情况呢
实际上有两个地方可能会出错,如果没有你的帮助,我们无法知道是哪一个
首先,如果您的结果[2]
已经是一个unicode
对象,在其上调用decode('cp037')
,将首先尝试使用sys.getdefaultencoding()
对其进行编码,这通常是'ascii'
,这样它就有东西要解码。因此,不是得到一个错误说“嘿,博佐,我已经解码了”,而是得到一个关于编码到ASCII失败的错误。(这可能看起来很愚蠢,但对于少数能够解码unicode
->unicode
或unicode
->str
的编解码器来说,这是非常有用的,比如ROT13和引用的printable。)
如果这是您的问题,解决方法是不要调用解码
。到目前为止,您可能已经在某个地方对数据进行了解码,所以不要再尝试这样做。(如果解码错误,则需要找出解码的位置并进行修复,以确保正确解码;如果解码错误,则重新解码也无济于事。)
其次,将Unicode字符串传递到print
将自动尝试使用sys.getdefaultencoding()
或sys.stdout.encoding
对其进行编码(取决于您的Python版本)。如果Python未能猜出控制台的正确编码(在Windows上非常常见),或者您是红色的