Sqlite und Umlaute in Textspalten

Liebe/-r Experte/-in,

ich benutze unter JAVA das „sqlitejdbc-v056.jar“ welches ich von http://www.zentus.com/sqlitejdbc/ bekommen habe um per JAVA Daten in die Sqlite DB zu schreiben.

Nach Debuggen und kontrolle der Bind Variablen mit Umlauten (welche in JAVA noch sehr gut aussehen) z.B. „T ü te mit sch ö ner Aufschrift“ sind diese hinterher in der Sqlite Datenbank (im DOS Fenster) ganz anders dargestellt -> „T ├╝ te 10 L mit sch ├╢ ner Aufschrift“.
In meiner Anwendung welche die Daten liest und anzeigt sehen die Umlaute dann nochmals anders aus.

Meine Frage nun wie bekomme ich die Umlaute nun richtig in die Textspalten das Ä Ö Ü korrekt erscheinen ?

Gruß Oliver

Hallo Oliver,

klingt so nach verschiedenen Kodierungen. SQLite benutzt per Default UTF-8 und in Deiner eigentlichen Umgebung vielleicht latin-1 … jedenfalls muss das wohl angepasst werden, dann sollten wohl Umlaute auch überall so aussehen, wie sie halt aussehen müssen.

Gruß
Ralf

P.S. wieso eigentlich anschauen per DOS-Box ? Gibt doch so nette Tools, wie z.B. den SQLite-Manager für Firefox.

Hallo Ralle,

ich bin auch schon hin gegangen und habe folgendes ausprobiert:

byte[] bytes = „T ü te“.getBytes(„UTF-8“);
String s = new String(bytes, „UFT-8“);
stmt.setString(1, s); //hier wird das Binding in das Statement gesetzt

oder auch direkt

database.executeUpdate(„INSERT INTO TEST(NAME) VALUES(‚T ü te‘);“);

auch das brachte keinen Erfolg.

Wenn ich die Werte so mit JAVA wegschreibe und anschl. in JAVA per Select mir die Daten wieder hole, sieht das gut aus, dann kommt als Ergebnis auch „Tüte“ zurück.

Wenn ich allerdings in der Dos-Box der Sqlite DB schaue steht da immer noch "„T├╝te“ drin :frowning:

Frage was kann ich nun genau tun wenn ->

„T ü te“.getBytes(„UTF-8“);
nichtmal richtig geht ?

Gruß ODIM

Hallo Oliver,

ich habe mich nie wirklich in die Thematik Codepages und dessen Konvertierungen reinhängen müssen.Könnte also nie genau sagen, wie wo was jetzt eingestellt werden muss. Aber eines ist mir schon klar, dass verschiedene Anwendungen auch verschiedene Codierungen benutzen.
Und wenn Anwendung A schreibt und das Lesen auch wieder korrekt funktioniert dann ist doch schonmal alles gar nicht so schlimm ( in meinen Augen ;o) ).
Jetzt versuchst Du mit Anwendung B (also die Konsole) ebenfalls zu lesen, die benutzt jedoch eine andere Codierung. Dann sieht es für die Darstellung natürlich nicht mehr so gut aus - aber solange Du „nur“ mal eben drüberschaust, kann man da vielleicht ein Auge zudrücken. Benutzt Du die Konsole jetzt auch zum Schreiben, ja dann sieht’s wohl übel aus und Anwendung A und B müssen dieselben Codierungen benutzen.

Das habe ich mal in Firefox mit SQLite Manager und der Konsole ausprobiert.
Sieht dann so aus:
Tte
Tüte2

So nun habe ich es hinbekommen !!!

Es ist klar das die Umlaute in einer DOS Box anders angezeigt werden als es tatsächlich der Fall ist, denn die DOS-Box benutzt standardmäßig die Windows Codepage 850 oder 1252, denn ein ".dump " der Sqlite DB im DOS-Fenster funktioniert einwandfrei und die Umlaute stehe super in der Textdatei.
In der Fire-Fox Erweiterung „SQLite Manager“ sehen die Umlaute auch gut aus !

Also konnte es nun nur noch an meiner C++ Anwendung (welche mit _UNICODE kompiliert wurde) liegen, und siehe da, alle meine Probleme haben sich in Luft aufgelöst wenn ich den selectierten DB String als Const Char* in C++ convertiere mit folgender Methode:

LPWSTR convert(const char \*multibyte) {
 int length;
 char \*unicode;

 length = strlen(multibyte) \* 2 + 2;
 unicode = new char [length];
 memset(unicode, 0, length);
MultiByteToWideChar(
**CP\_UTF8** ,
0,
multibyte,
strlen(multibyte)+1,
(LPWSTR) unicode,
length);

 return (LPWSTR) unicode;
}

Daumen hoch -

was ist denn aus Deinem Javaprogramm geworden ?

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Meine JAVA Anwendung liest nach wie vor die Daten aus ORACLE aus und schreibt sie direkt in die SQLite DB.
Das SQLite DB Fiele schiebe ich dann mittels Active Sync auf ein Mobile Pocket PC wo dann meine Scanner Anwendung (C++) läuft und Stammdaten aus der Sqlite DB braucht.
Nur das Darstellen auf dem Mobilen Endgerät war ja bisher mein Problem, was ich aber wie oben beschrieben gelöst habe.