2012-05-12 13 views
5

Aktualnie tworzę grę menedżerską, używając sqlite i C++. Znalazłem tutoriale na temat pokrycia niemal każdego obszaru, który był potrzebny do stworzenia mojej gry, ale drobny problem od dawna mnie dręczy.Pisanie ciągów unicode w języku C++ do sqlite DB

kiedy piszę ciąg w języku C++, na przykład "Andreas Klöden" i używa go z instrukcją sqlite do wstawienia danych w moim sqlite DB, znaki specjalne z umlaut ö są tracone, dotyczy to wielu europejskich nazw, takich jak Léfevre, Würth itp.

Szukałem odpowiedzi na to, wydaje się, że łańcuchy C++ są w ANSII lub coś w tym stylu. Jakoś mam napisać unicode ciągi zamiast uniknąć problem poniżej:

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

czy ktoś wie jak napisać Unicode w C++, więc mogę eksportować/importować poprawnych danych z DB sqlite?

+1

patrzysz na std :: wstring? – maress

+0

Nie ma czegoś takiego jak ANSII; wygląda jak skrzyżowanie [ASCII] (http://en.wikipedia.org/wiki/Ascii) (7-bitowy zestaw znaków) i [ANSI] (http://en.wikipedia.org/wiki/Windows -1252) (Mylna nazwa Microsoft dla 8-bitowego zestawu znaków podobnego do Latin-1). Istnieje wiele różnych sposobów reprezentowania ciągów Unicode. [UTF-8] (http://en.wikipedia.org/wiki/Utf-8) jest ogólnie najlepszy, ale Windows lubi używać [UTF-16] (http://en.wikipedia.org/wiki/UTF -16). –

Odpowiedz

4

SQLite "obsługuje" kodowanie UTF-8 (cytaty są tutaj, ponieważ w zasadzie UTF8 używa tylko znaków ASCII, więc nie ma nic do "wsparcia" w rzeczywistości). Tak więc jednym z najlepszych (a także zgodnych wstecz) sposobów jest użycie kodowania UTF-8. Obsługa przychar_t w SQLite jest również obecna, ale jest tylko jeden powód, aby go użyć: jeśli już kodujesz, to zależy od wchar_t.

Przeczytaj to jeśli "UTF-8" nie jest obeznany w temacie: http://www.joelonsoftware.com/articles/Unicode.html

Wywołanie C API

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

by wykonać zadanie.

Rzeczywistą konwersję można wykonać ręcznie, jeśli trzeba obsługiwać tylko ograniczoną liczbę stron kodowych lub korzystać z biblioteki ICU w celu uzyskania pełnego wsparcia. Istnieją również libs jak http://utfcpp.sourceforge.net/

CodeProject ma również wiele UTF-8 kodów próbki:

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

itp

+0

wielkie dzięki, dam zrób z sugestiami i wróć z wynikami :) – TPhoton

+0

Nie ma za co. Nie publikuję odpowiedzi odznaczonych i wierzę, że od lat mam problemy z moim rodzimym cyrylicą, więc UTF-8 było wielką ulgą :) –

+0

W porządku Udało mi się stworzyć instrukcję wstawienia sqlite jako komendę const wchar_t. następny problem podczas pisania polecenia sqlite w języku C++: rc = sqlite3_exec (db, sqlInsertTest, NULL, NULL i błąd); mówi, że nie może konwertować z const char na const wchar_t, więc w jakiś sposób oczekuje standardowego znaku, a nie specjalnego wchar_t. Czy znasz funkcję równej sqlite dla wchar_t? – TPhoton

-1

CppSqlite3U został opracowany w celu będący opakowaniem dla sqlite3, który nie obsługuje standardu UNICODE. CppSqlite3U może być używany jako przód dla twoich połączeń UNICODE.

Powiązane problemy