Python响应对象返回意外的utf代码点

时间:2018-04-26 04:56:00

标签: python xml soap unicode

我试图使用Response库从Web服务以xml字节字符串的形式检索响应,使用内存中的XSLT解析它,并使用pyodbc将输出写入Teradata。我正在使用python 3。

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

'作为â和其后的两个不可打印的字符(PAD,根据记事本++的SGCI)

响应中也有可能出现汉字字符。

我的代码:

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.

1 个答案:

答案 0 :(得分:0)

升级到Teradata 16.20驱动程序可以解决这个问题,但我从来没能弄清楚为什么会发生这种情况。