2010-11-01 7 views
1

J'ai écrit un programme qui convertit une table SQL Server en une table SQLite. Ceci est un programme C++ utilisant ADO (COM) pour récupérer les données de SQL Server et l'interface C SQLite (encapsulé par ma propre classe C++).SQLite Transformation de caractères

Dans SQL Server, j'ai un enregistrement avec un champ ayant le contenu:

Haagen-Dazs

(Ce premier A a deux points dessus). Je lis ce champ dans ADO et le convertit d'un BSTR en un char *, puis le lie à une instruction SQLite INSERT. Quand je regarde ce champ dans SQLiteSpy (et d'autres outils), je vois que le champ apparaît comme 'H AGEN DAZS'.

Dans le débogueur, je peux voir que le Ä est le caractère 0xc4, qui est la représentation UTF-8 correcte pour ce caractère. Il semble que SQLite est mutiler mon 'Ä'

Ceci est mon SQLite CREATE TABLE:

CREATE TABLE Company ([Lookup] CHAR (30)) 

Ceci est ma déclaration SQLite INSERT:

INSERT INTO Company ([Lookup]) VALUES (?) 

je convertir du BSTR fourni par ADO à un char * en utilisant cet appel de fonction:

WideCharToMultiByte(CP_ACP,0,In_,-1,Out_,MaxLen_,0,0); 

Ceci est mon SQLite Bind déclaration:

sqlite3_bind_text(Statement,1,Text_,-1, (BindFunction) SQLITE_TRANSIENT); 

J'ai confirmé dans le débogueur qu'à ce stade, texte_ est « Haagen-Dazs » et que A est vraiment caractère 0xC4.

Des idées sur ce qui se passe ici?

Répondre

3

0xC4 n'est pas utf-8 pour Ä. C'est isolatin-1 (également connu sous le nom 8859-1) pour Ä, ce qui signifie qu'il est aussi (en quelque sorte) l'utf-16: u00C4. Le codage utf-8 est 0xC3 0x84, deux octets.

+0

Vous avez raison, je n'ai pas remarqué le x84 sur ma carte. –