Sonderzeichen werden nicht dargestellt (mit Kästchen ersetzt)

  • Antworten:14
  • Bentwortet
Tim Meißner
  • Forum-Beiträge: 238

15.11.2010, 19:23:28 via Website

Moin!

Habe ein unschönes Problem: meine Sonderzeichen in den Strings werden wenn sie einer TextView oder so zugewiesen werden nicht als Sonderzeichen dargestellt, sondern als Kasten. Sieht danach aus als ob das falsche Charset geladen ist, welches diese Zeichen nicht enthält.
Jemand ne Idee?

Mit freundlichen Grüßen
Tim Meißner

Antworten
Gelöschter Account
  • Forum-Beiträge: 5.136

15.11.2010, 19:53:54 via Website

Hallo Tim,

hast Du in Deiner Strings.xml im "res" Ordner folgende Zeile im Header der xml Datei?
<?xml version="1.0" encoding="utf-8"?>

Das utf-8 sollte für die korrekte Darstellung sorgen, immer vorausgesetzt, dass Du einen Font verwendest, der diese Zeichen auch unterstützt.

Was für Sonderzeichen willst Du denn darstellen und welchen Font verwendest Du?

lg Voss

Antworten
Tim Meißner
  • Forum-Beiträge: 238

15.11.2010, 20:42:05 via Website

ja habe utf-8 in der xml.
Ich will sans-serif benutzen. Es geht um normale Sonderzeichen ala ä ü ö.
1<?xml version="1.0" encoding="utf-8"?>
2<resources>
3 <style name="ButtonStyle" parent="@android:style/TextAppearance.Medium">
4 <item name="android:textColor">#C9C9C9</item>
5 <item name="android:textStyle">bold</item>
6 <item name="android:typeface">sans</item>
7<item name="android:textSize">14sp</item>
8<item name="android:gravity">center</item>
9</style>
10</resources>

— geändert am 15.11.2010, 20:42:59

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

15.11.2010, 22:14:55 via Website

Ich hatte dieses Problem mal, als ich testweise ein mit Eclipse erstelltes Projekt ins MotoDev Studio importiert habe.
Da lag es offenbar an der Codierung der Sourcecodes, vielleicht schaust du da mal nach...

Antworten
Tim Meißner
  • Forum-Beiträge: 238

15.11.2010, 22:43:17 via Website

codierung des sourcecodes? also wie ich im code selber die strings codiere? das ist nen interessanter ansatz, gleich mal schauen danke :)
Es geht um diesen Codeabschnitt, der Fehlerhafte Zeichen erzeugt:
1// Create the Database (no Errors if it already exists)
2 myDB = this.openOrCreateDatabase(Hauptmenu.MY_STORAGE + Hauptmenu.DATA_FILE, MODE_PRIVATE, null );
3 Cursor c = myDB.rawQuery("SELECT * FROM fragenkatalog;", null);
4 startManagingCursor(c);
5
6
7 //read through the result of the query and generate questions
8 while(c.moveToNext())
9 {
10 int id = c.getInt(c.getColumnIndex("id"));
11 int category = c.getInt(c.getColumnIndex("category"));
12 String question = c.getString(c.getColumnIndex("question"));
13 int correct = c.getInt(c.getColumnIndex("correct_answer"));
14
15
16 String[] answer = new String[] {c.getString(c.getColumnIndex("answer1")), c.getString(c.getColumnIndex("answer2")),c.getString(c.getColumnIndex("answer3")),c.getString(c.getColumnIndex("answer4"))};
17 Frage frage = new Frage(id,question, answer, correct, category);
18 fragenKatalog.add(frage);
19 }

Wenn ich nun eine TextView mit festgelegtem Text erzeuge stellt sie alles super dar. Nur aus der SQLite DB gehts nicht (dort ist aber alles i.O.)

— geändert am 15.11.2010, 22:56:48

Antworten
Gelöschter Account
  • Forum-Beiträge: 5.136

15.11.2010, 23:47:49 via Website

Hallo Tim,

lass Dir doch mal bitte mit folgender Zeile eine Logausgabe generieren und schreib mal was danach bei Dir im Log steht.

1String enc = Charset.defaultCharset().displayName();
2 Log.d("Charset", enc);


Bestenfalls machst Du das genau vor der Ausgabe die fehlschlägt.

Bei mir steht dort, so wie es sein sollte "UTF-8"

lg Voss

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

16.11.2010, 01:33:47 via Website

Wenn ich nun eine TextView mit festgelegtem Text erzeuge stellt sie alles super dar.

Dann liegts schon mal nicht am Editor (wie bei mir seinerzeit mit MotoDev)


Nur aus der SQLite DB gehts nicht (dort ist aber alles i.O.)

Das weißt du woher?

Darauf bin ich am Anfang auch mal hereingefallen - wenn du die DB am PC mit einer Software befüllst, dann mußt du selber darauf achten, das die eingetragenen Strings in UTF-8 vorliegen, anderenfalls kommt es genau zu dem von dir beschriebenen Effekt.

Antworten
Tim Meißner
  • Forum-Beiträge: 238

16.11.2010, 07:23:08 via Website

1Log.d("Charset", enc);
gibt mir "UTF-8" aus.

@and dev: wie überprüfe ich in meiner db denn den charset? mein programm das ich benutze kann das nicht. Es zeigt aber alles so an, wie ich es eingetippt habe. Also mit Umlauten und allem.
Edit: Mit "SQLiteManager" werden diese komischen Zeichen auch in der DB angezeigt -.- Habe den Fehler also gefunden. Wie behebe ich ihn? :P

— geändert am 16.11.2010, 07:30:46

Antworten
Gelöschter Account
  • Forum-Beiträge: 5.136

16.11.2010, 07:24:28 via Website

Guter Ansatz And dev!!!!

lg Voss

Antworten
Gelöschter Account
  • Forum-Beiträge: 5.136

16.11.2010, 07:46:27 via Website

Moin Timo,

Du könntest mal versuchen, auf dem bisher bei Dir üblichen Weg eines der "Ä" bei Dir durch folgendes zu ersetzen:

&#196;

Wird dann danach das "Ä" in Deine Applikation korrekt angezeigt, hast Du genau das von And dev bechriebene Problem. Dein Windows codiert die Zeichen in die Datenbank vermutlich mit ISO 8859-15 hinein, das nicht UTF-8 kompatibel ist sondern nur ein erweiterter 8-Bit Ascii Zeichensatz. Unicode Zeichen werden aber anders kodiert und da kann ein Sonderzeichen schon mal 2 bis 3 Byte lang sein. In Deiner Datenbank steht aber nur das erste Byte und dadurch wird das Zeichen falsch interpretiert.

lg Voss

Antworten
Tim Meißner
  • Forum-Beiträge: 238

16.11.2010, 07:49:57 via Website

Vielen dank. :)
Habe das jetzt mit SqliteManager per Hand geändert und in UTF-8 gewandelt und in meinem php script für die Datenbank auf die richtige Kodierung geachtet. Läuft jetzt danke!
Heiße btw. Tim und nicht Timo :P aber ist ja noch früh^^
Werde meine App dann bald auch mal der Öffentlichkeit vorstellen :)

— geändert am 16.11.2010, 07:50:16

Antworten
Gelöschter Account
  • Forum-Beiträge: 5.136

16.11.2010, 08:03:33 via Website

Ups ..sorry Tim !!!

Wie ich gerade nachgelesen habe, dürfte es sich hier um einen Bug in SQLite handeln. Bestehende Datenbanken die nicht explizit mit PRAGMA encoding="UTF8" erstellt wurden, verwenden das Quell - encoding des verwendeten Charsets was im nachhinein nicht mehr änderbar ist. Das wird bei Dir eben ISO 8859-15 gewesen sein.

Schön, dass Du Dein Problem lösen konntest!

Nur so nebenbei ... UTF-8 Konversionsprobleme während dem ersten Kaffee, so früh am Morgen ... das ist harter Tobak ... :):):cold:

— geändert am 16.11.2010, 08:05:24

lg Voss

Antworten
San Blarnoi
  • Forum-Beiträge: 2.545

16.11.2010, 09:49:28 via Website

wie überprüfe ich in meiner db denn den charset?

Genau das hätte ich vorgeschlagen:
Mit "SQLiteManager" werden diese komischen Zeichen auch in der DB angezeigt

...wobei ich SQLiteMan bevorzuge ;)


Es scheint das Android/Java die ausgelesenen Daten grundsätzlich als UTF interpretiert, egal was man reinschreibt bzw. einstellt.

Antworten
name unwichtig
  • Forum-Beiträge: 2

28.06.2012, 14:46:25 via Website

hallo,
ich habe den gleichen bug gehabt und konnte ihn ebenfalls beheben. Jetzt kommt aber noch dazu, dass dieses Zeichen: ^
nicht akzeptiert wird. Wie kann man ihn umgehen?

Antworten
name unwichtig
  • Forum-Beiträge: 2

28.06.2012, 14:47:30 via Website

mit umgehen wird Problem gemeint. Das Zeichen an sich muss ich benutzen.

Antworten