Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Python';解码(';cp037';)在特定二进制数组上不工作?_Python_Binary_Byte_Bytearray_Ibm Midrange - Fatal编程技术网

为什么Python';解码(';cp037';)在特定二进制数组上不工作?

为什么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

打印DB2查询结果时,我在列“F00002”上遇到以下错误,该列是一个二进制数组

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
i、 例如,您的声明翻译为:

>>> 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
i、 例如,您的声明翻译为:

>>> 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上非常常见),或者您是红色的