Python 将中文字符从 Oracle 导入 json.dump 时抛出 UnicodeDecodeError
Python UnicodeDecodeError thrown when bringing Chinese Chars from Oracle to json.dump
我正在使用 pyodbc 从 Oracle 数据库查询财务数据 - 每个字段都很好,可以转储到 json 数据,然后我将这些数据显示在网页上。
我似乎无法弄清楚第 17 个字段 - '\xab\xed\xa5\xcd\xab\xfc\xbc\xc6' - 当我将它打印到屏幕上时,Python 显示了正确的中文 - 但是当我输出它要么中文字符在 json 转储中丢失,要么字符抛出以下错误。
我假设这是我应该解码然后重新编码的字节串,但重新编码为 ascii 或 UTF8 总是会在此处引发错误。
有没有人有帮助我的建议?我花了几天时间阅读有关编码的文章,但似乎仍然无法理解为什么会抛出 utf-8 字符。
确切的错误是:'utf8' 编解码器无法解码位置 0 中的字节 0xf9:无效的起始字节,它只出现在我向 [=31 吐出的一些汉字上=] - 但是 none 的字符在加载 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
弄清楚了 - 这绝对只是一个编码问题 - 不知道我得到的是什么字符编码,就像每个 post 所说的那样,这是我过去几天生活的祸根。我设法在主机上抽出时间,经过大量阅读,我检查了系统编码如下:
import sys
sys.stdout.encoding
这返回:
> 'cp950'
然后我使用 ord() 吐出编码数据,为 JSON 转储做准备:
outputStr = ''.join(chr(ord(c)) for c in s).decode('cp950')
我正在使用 pyodbc 从 Oracle 数据库查询财务数据 - 每个字段都很好,可以转储到 json 数据,然后我将这些数据显示在网页上。
我似乎无法弄清楚第 17 个字段 - '\xab\xed\xa5\xcd\xab\xfc\xbc\xc6' - 当我将它打印到屏幕上时,Python 显示了正确的中文 - 但是当我输出它要么中文字符在 json 转储中丢失,要么字符抛出以下错误。
我假设这是我应该解码然后重新编码的字节串,但重新编码为 ascii 或 UTF8 总是会在此处引发错误。
有没有人有帮助我的建议?我花了几天时间阅读有关编码的文章,但似乎仍然无法理解为什么会抛出 utf-8 字符。
确切的错误是:'utf8' 编解码器无法解码位置 0 中的字节 0xf9:无效的起始字节,它只出现在我向 [=31 吐出的一些汉字上=] - 但是 none 的字符在加载 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
弄清楚了 - 这绝对只是一个编码问题 - 不知道我得到的是什么字符编码,就像每个 post 所说的那样,这是我过去几天生活的祸根。我设法在主机上抽出时间,经过大量阅读,我检查了系统编码如下:
import sys
sys.stdout.encoding
这返回:
> 'cp950'
然后我使用 ord() 吐出编码数据,为 JSON 转储做准备:
outputStr = ''.join(chr(ord(c)) for c in s).decode('cp950')