Sqlite unixODBC对SQLWCHAR需要哪种编码?

Sqlite unixODBC对SQLWCHAR需要哪种编码?,sqlite,unicode,odbc,unixodbc,Sqlite,Unicode,Odbc,Unixodbc,UnixODBC的SQLWCHAR类型是一个无符号短int,与Windows上的wchar\u t类型的大小相匹配。我假设编码必须是UCS2,但使用SQLite ODBC驱动程序的快速测试应用程序失败。 如果我使用类似INSERT的UCS2字符串调用SQLExecDirectW到foonName值“ä”,则存储值0xE4,该值是正确的UCS2值,但应存储为UTF-8 0xC3A4 如果我在第一步将UCS2字符串转换为UTF-8字符串,然后写入每个字节!在SQLWCHAR数组中,SQLExecDi

UnixODBC的SQLWCHAR类型是一个无符号短int,与Windows上的wchar\u t类型的大小相匹配。我假设编码必须是UCS2,但使用SQLite ODBC驱动程序的快速测试应用程序失败。 如果我使用类似INSERT的UCS2字符串调用SQLExecDirectW到foonName值“ä”,则存储值0xE4,该值是正确的UCS2值,但应存储为UTF-8 0xC3A4

如果我在第一步将UCS2字符串转换为UTF-8字符串,然后写入每个字节!在SQLWCHAR数组中,SQLExecDirectW调用将正确的值插入数据库。 但是在我看来,将一个UTF-8 1字节序列打包成一个仍然包含UTF-8的2字节序列是绝对错误的

只是一个提示:

pyhton3上的pyodbc也使用了广域API,出现了相同的问题:

cursor.execute("INSERT INTO bla VALUES('ä')")
这导致:

sqlite> select hex(id), id from bla;
E4|�

您确定SQLite ODBC驱动程序支持宽API吗。如果没有,则unixODBC驱动程序管理器将悄悄地从UCS2 SQLWCHARs中删除顶部字节,然后传递给ansi API,即,您调用SQLExecDirectW,而SQLite ODBC没有它,unixODBC将调用SQLExecDirectA。我自己不使用SQLite ODBC驱动程序,只是为了检查一下。用于Linux的SQLite驱动程序只提供ANSI函数。但是,驱动程序管理器必须将应用程序中的宽字符串转换为驱动程序的ANSI字符串。在Windows上,此转换使用ANSI字符集的Windows代码页,我假设Linux的行为应该类似,而不仅仅是剥离顶部字节。仅仅剥离就会使整个ODBC“设计”彻底崩溃。