我编写了一个将SQL Server表转换为SQLite表的程序。这是一个使用ADO(COM)从SQL Server和C SQLite接口检索数据的C ++程序(由我自己的C ++类包装)。
在SQL Server中,我有一个包含内容字段的记录:
哈根达斯
(第一个A有两个点)。我通过ADO读取此字段并将其从BSTR转换为char *,然后将其绑定到SQLite INSERT语句。当我在SQLiteSpy(以及其他工具)中查看此字段时,我看到该字段显示为“H AGENDAZS”。
在调试器中,我可以看到Ä是字符0xc4,这是该字符的正确UTF-8表示。似乎SQLite正在破坏我的'Ä'
这是我的SQLite CREATE TABLE语句:
CREATE TABLE Company ([Lookup] CHAR (30))
这是我的SQLite INSERT语句:
INSERT INTO Company ([Lookup]) VALUES (?)
我使用此函数调用将ADO提供的BSTR转换为char *:
WideCharToMultiByte(CP_ACP,0,In_,-1,Out_,MaxLen_,0,0);
这是我的SQLite Bind声明:
sqlite3_bind_text(Statement,1,Text_,-1, (BindFunction) SQLITE_TRANSIENT);
我已经在调试器中确认,此时Text_是“HÄAGEN-DAZS”,而A实际上是字符0xc4。
关于这里发生了什么的任何想法?
答案 0 :(得分:3)
0xC4不是utf-8。对于Ä,它是isolatin-1(也称为8859-1),这意味着它也是(某种)utf-16:u00C4。 utf-8编码是0xC3 0x84,两个字节。