Я написал программу, которая преобразует таблицу SQL Server в таблицу SQLite. Это программа на C ++, использующая ADO (COM) для извлечения данных из SQL Server и интерфейса C SQLite (завернутый в мой собственный класс C ++).
В SQL Server у меня есть запись с полем, содержащим содержимое:
Haagen-Dazs
(Эта первая буква А имеет две точки над ней). Я прочитал это поле через ADO и преобразовал его из BSTR в char *, а затем связал его с оператором 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 (?)
Я конвертирую из BSTR, предоставленного ADO, в char *, используя этот вызов функции:
WideCharToMultiByte(CP_ACP,0,In_,-1,Out_,MaxLen_,0,0);
Это мой оператор привязки SQLite:
sqlite3_bind_text(Statement,1,Text_,-1, (BindFunction) SQLITE_TRANSIENT);
Я подтвердил в отладчике, что на этом этапе Text_ является "HÄAGEN-DAZS" и что A действительно является символом 0xc4.
Есть идеи, что здесь происходит?