SQLite Преобразование символов - PullRequest
1 голос
/ 01 ноября 2010

Я написал программу, которая преобразует таблицу 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.

Есть идеи, что здесь происходит?

1 Ответ

3 голосов
/ 01 ноября 2010

0xC4 не является utf-8 для Ä.Это изолатин-1 (также известный как 8859-1) для Ä, что означает, что он также (вроде) utf-16: u00C4.Кодировка utf-8: 0xC3, 0x84, два байта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...