首页 > 解决方案 > Python 响应对象返回意外的 utf 代码点

问题描述

我正在尝试使用响应库从 Web 服务中检索 xml 字节字符串形式的响应,使用内存中的 XSLT 对其进行解析,然后使用 pyodbc 将输出写入 Teradata。我正在使用python 3。

任何超出标准 ascii 127 代码点的字母似乎都以两个字符的形式出现。例如 ü 作为 ü 进入数据库。

' 以 â 的形式出现,后面有两个不可打印的字符(PAD 和 SGCI,根据 notepad++)

响应中也有汉字字符的可能性。

我的代码:

cnxn.pyodbc.connect('mydsn')
cnxn.setdecoding(pyodbc.SQL_CHAR, encoding='utf-8')
cnxn.setdecoding(pyodbc.SQL_WCHAR, encoding='utf-8')
cnxn.setdecoding(pyodbc.SQL_WMETADATA, encoding='utf-8')
cnxn.setencoding(encoding='utf-8')
cursor = cnxn.cursor()

transform = etree.XSLT(etree.fromstring(xsltasstring))
p = etree.XML(response.content)
result_tree = transform(p)
linefeed = '\n'
recordseperator = ','
output_list = str(result_tree).split(linefeed)
insert_sql = 'insert into the_table(.....)'
for item in output_list:
    temp_list = item.split(recordseperator)
    final_list.append(temp_list)
    print(item)
    print(item.encode())
cursor.executemany(insert_sql,final_list)

当我查看数据库时,一个示例字符串:ação 已被翻译为 ação

在循环,

 print(item) outputs correctly: ação`

 print(final_list) also looks correct: ação

 print(item.encode()) outputs b'a\xc3\xa7\xc3\xa3o'

c3,a7,c3,x3 corresponds to çã. 我不明白是什么原因造成的,或者如何解决它。

我本来希望看到类似的东西:b'a\xe7\xe3o'

根据 odbc 跟踪,我确实看到那些代码点 c3、a7 和 x3 被传递到缓冲区。

来自 Web 服务的响应确实有UTF-8编码声明,并且 Web 服务供应商还说响应编码是UTF-8.

标签: pythonxmlsoapunicode

解决方案


升级到 Teradata 16.20 驱动程序解决了这个问题,但我一直无法弄清楚为什么会发生这种情况。


推荐阅读