我使用pyodbc从Oracle数据库查询财务数据 - 每个字段都很好,可以转储到json数据,然后我会在网页上显示。
我似乎无法弄清楚第17个字段的内容 - ' \ xab \ xed \ 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',
> '\xf9\xda\xa5\xcd\xab\xfc\xbc\xc6', None, '+19163.8', '118', '-0.10',
> '+9.43', '+28588.52', '+18278.80', '-21.34', '0', '0', '0', '0',
> '-0.10', '\xab\xed\xa5\xcd\xab\xfc\xbc\xc6', '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
答案 0 :(得分:2)
想出来 - 这绝对只是一个编码问题 - 不知道我得到的字符编码,就像每个帖子所说的那样,是我过去几天存在的祸根。我设法在主机上有时间,经过多次阅读后,我检查了系统编码的内容如下:
import sys
sys.stdout.encoding
这返回:
> 'cp950'
然后我使用ord()吐出编码数据以准备JSON转储:
outputStr = ''.join(chr(ord(c)) for c in s).decode('cp950')