2012-05-12 11 views
5

Attualmente sto creando un gioco manager utilizzando sqlite e C++. Ho trovato tutorial su quasi tutte le aree necessarie per creare il mio gioco, ma un problema minore mi ha infastidito da anni.Scrittura stringhe unicode in C++ in sqlite DB

quando scrivo una stringa in C++ ad esempio "Andreas Klöden" e la utilizzo con un'istruzione sqlite per inserire i dati nel mio DB sqlite i caratteri speciali con umlaut ö sono persi, questo vale per molti nomi europei come Léfevre, Würth ecc.

Ho cercato una risposta a questo sembra che le stringhe di C++ siano in ANSII o qualcosa del genere. In qualche modo dovrei scrivere stringhe Unicode invece per evitare il problema illustrato di seguito:

http://imageshack.dk//viewimage.php?file=/imagesfree/0Ej53884.png

Qualcuno sa come scrivere stringhe Unicode in C++ in modo da poter esportare/importare i dati corretti dal DB SQLite?

+1

hai guardato std :: wstring? – maress

+0

Non esiste una cosa come ANSII; sembra un incrocio tra [ASCII] (http://en.wikipedia.org/wiki/Ascii) (un set di caratteri a 7 bit) e [ANSI] (http://en.wikipedia.org/wiki/Windows -1252) (termine improprio di Microsoft per un set di caratteri a 8 bit simile a Latin-1). Esistono diversi modi per rappresentare le stringhe Unicode. [UTF-8] (http://en.wikipedia.org/wiki/Utf-8) è generalmente il migliore, ma a Windows piace usare [UTF-16] (http://en.wikipedia.org/wiki/UTF -16). –

risposta

4

SQLite "supporta" UTF-8 (le virgolette sono qui perché in pratica UTF8 utilizza solo caratteri ASCII quindi non c'è nulla da "supportare" in realtà). Quindi uno dei modi migliori (e anche retrocompatibili) è usare la codifica UTF-8. è presente anche il supporto wchar_t in SQLite, ma c'è un solo motivo per usarlo: se il codice dipende già da wchar_t.

Leggi questo se "UTF-8" non è un argomento familiare: http://www.joelonsoftware.com/articles/Unicode.html

La chiamata alla API C

sqlite_exec(db_conn, "insert somevalue into sometable values(\"utf encoded string\""), NULL, NULL, "error"); 

avrebbe fatto il lavoro.

La conversione effettiva può essere eseguita manualmente se è necessario supportare solo una quantità limitata di codepage o utilizzare la libreria ICU per il supporto completo. Ci sono anche librerie come http://utfcpp.sourceforge.net/

CodeProject ha anche un sacco di UTF-8 codici di esempio:

http://www.codeproject.com/Articles/14637/UTF-8-With-C-in-a-Portable-Way

http://www.codeproject.com/Articles/5281/UTF-8-Encoding-and-Decoding

ecc

+0

grazie mille ci provo con i suggerimenti e ritorno con i risultati :) – TPhoton

+0

Prego. Non invio risposte non verificate e credo di avere anche problemi con il mio alfabeto cirillico nativo per anni, quindi UTF-8 è stato un grande sollievo :) –

+0

ok, sono riuscito a creare un'istruzione di inserimento sqlite come comando const wchar_t. problema successivo quando scrivo il comando sqlite in C++: rc = sqlite3_exec (db, sqlInsertTest, NULL, NULL, & error); dice che non può convertire da const char a const wchar_t, quindi in qualche modo si aspetta un char standard e non lo speciale wchar_t. Conoscete una funzione sqlite uguale per wchar_t? – TPhoton

-1

CppSqlite3U è stato sviluppato con lo scopo di essere un wrapper per sqlite3, che non supporta UNICODE. CppSqlite3U può essere utilizzato come front-end per le chiamate UNICODE.