我编写了一个将 SQL Server 表转换为 SQLite 表的程序。这是一个使用 ADO (COM) 从 SQL Server 和 C SQLite 接口(interface)(由我自己的 C++ 类包装)检索数据的 C++ 程序。
在 SQL Server 中,我有一个记录,其中包含一个包含以下内容的字段:
哈根达斯
(第一个 A 上面有两个点)。我通过 ADO 读取这个字段并将其从 BSTR 转换为 char*,然后将其绑定(bind)到 SQLite INSERT 语句。当我在 SQLiteSpy(和其他工具)中查看此字段时,我看到该字段显示为“H�AGEN DAZS”。
在调试器中,我可以看到 Ä 是字符 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。
关于这里发生的事情有什么想法吗?
最佳答案
0xC4 不是 Ä 的 utf-8。它是 Ä 的 isolatin-1(也称为 8859-1),这意味着它也是(有点)utf-16:u00C4。 utf-8编码为0xC3 0x84,两个字节。
关于c++ - SQLite 字符转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4070349/