将中文字符从Oracle带到json.dump时引发Python UnicodeDecodeError



我正在用pyodbc从Oracle数据库中查询财务数据-每个字段都很好,可以转储到json数据,然后显示在网页上。

我似乎不知道第17个字段"\xab\xxed\xa5\xcd\xab\xfc\xbc\xc6"是怎么回事——当我将其打印到屏幕上时,Python会显示正确的中文——但当我输出它时,中文字符要么在json转储中丢失,要么会引发以下错误。

我假设这是一个字节串,我应该解码然后重新编码,但重新编码为ascii或UTF8总是在这里抛出错误。

有人建议帮我吗?我花了好几天的时间阅读编码,似乎仍然不明白为什么要抛出utf-8字符。

确切的错误是:"utf8"编解码器无法解码位置0中的字节0xf9:无效的起始字节,它只出现在我向JSON吐出的一些汉字上,但加载JSON时没有一个字符看起来正确。

for row in cur.fetchall(): 
    print row 
    print row[17]
    jsonData = json.dumps(row[17].decode('utf-8'), encoding='latin1')

这将产生以下输出:

> ('.HSI', 'HANG SENG INDEX', Decimal('1'), '+21316.47', '-21.34',
> '+1457369960', '0', '0', datetime.datetime(2016, 4, 18, 0, 0, 55),
> datetime.datetime(2016, 4, 15, 8, 1, 22), '+21423.06', '+21234.12',
> '344', Decimal('0'), '+21374.65', '+21337.81', '0',
> 'xf9xdaxa5xcdxabxfcxbcxc6', None, '+19163.8', '118', '-0.10',
> '+9.43', '+28588.52', '+18278.80', '-21.34', '0', '0', '0', '0',
> '-0.10', 'xabxedxa5xcdxabxfcxbcxc6', '0', '0', '0', '0', '0',
> '0', '0', '0', '0', '0', '0#.HSI', Decimal('1'), '.HSI',
> datetime.datetime(2016, 4, 17, 23, 58, 18))
> 恒生指數
>  return codecs.utf_8_decode(input, errors, True)
> UnicodeDecodeError: 'utf8' codec can't decode byte 0xf9 in position 0: 
> invalid start byte

弄清楚了——这绝对只是一个编码问题——就像每个帖子所说的那样,不知道我得到了什么字符编码,这是我过去几天生存的祸根。我设法在主机上获得了时间,经过大量阅读,我检查了系统编码如下:

import sys
sys.stdout.encoding

返回:

> 'cp950'

然后,我使用ord()吐出编码数据,为JSON转储做准备:

outputStr = ''.join(chr(ord(c)) for c in s).decode('cp950')

相关内容

  • 没有找到相关文章

最新更新