我试图使用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.
答案 0 :(得分:0)
升级到Teradata 16.20驱动程序可以解决这个问题,但我从来没能弄清楚为什么会发生这种情况。