EditText -> getBytes() und Problem mit Umlauten / Charset

  • Antworten:5
  • OffenNicht stickyNicht beantwortet
  • Forum-Beiträge: 53

03.04.2018, 00:03:49 via Website

Hi Leute,

hoffe ihr hattet ein schönes Wochenende und Ostern.
Ich habe hier ein Problem, das "scheinbar" einfach ist, ich aber nicht weiter komme.

Um andere Quellen zu isolieren habe ich auch ein frisches Projekt erstellt, nur zu diesem Zweck.
Ich habe ein simles EditText-Feld, wo ich z.B. "Würde" reinschreibe. Mit einem Klick auf einen Button, wird dann folgender Code ausgeführt:

String text = textInput.getText().toString();

byte[] textBytes;
try
{
    textBytes = text.getBytes("UTF-8");
    Log.d("ECHO ::",Integer.toString(textBytes[1]));
}
catch(UnsupportedEncodingException e)
{
    e.printStackTrace();
}

So. Wie im Code zu sehen, mach ich eine simple Ausgabe des 2 Bytes (im Beispiel 'ü'). Und genau da liegt das Problem!
Anstatt die richtige '252', erhalte ich da immer nur eine '-61'. Ich weiß aber nicht warum.
Auch bei "ä, ö, ß" nur '-61'. Byte ist zwar signed, aber da müsste ich ja dann die richtigen, negativen Werte erhalten.
Dazu habe ich nur vereinzelte Themen auf Stackoverflow gefunden, jedoch nichts relevantes.

Weiß da einer von euch weiter?

Ich teste immer auf meinem Xperia V mit LineageOS (Android 7.1.2) über USB-Debugging.

Diskutiere mit!
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.166

03.04.2018, 01:29:43 via App

Vielleicht solltest du dich in Sachen Zeichensätze mal einlesen.
252 steht für 'ü' aber nur in ISO-8859-1 o.ä. aber nicht in utf-8.

In UTF-8 ist das kleine ü in Hex c3bc (2Bytes länge!)
Und c3 im ist als int -61 im Zweierkomplement.
Genauso verhält es sich auch bei den anderen Sonderzeichen.

Aber warum willst du das Byte Array als Int umwandeln? Was ist der Sinn dahinter?
Umgewandelt wird es auf jeden Fall richtig...

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 53

03.04.2018, 10:29:43 via Website

Hi Pascal,

ja, hast recht. Ich habe mich mit den zeichensätzen noch nicht wirklich beschäftigt. Habe es hier auch falsch verstanden.
Wenn ich es richtig verstehe, so wäre 'ü' in UTF-8 mit den Bytes "195 188" angegeben.
Das heißt, ich bekomme das Problem, weil ich versuche das Zeichen 'ü' in einem Byte zu speichern, oder?

Wie kann ich denn bei getBytes() nachher das 'ü' ansprechen?
Ich werd mich auf jeden Fall nachher etwas einlesen...

Danke schonmal.

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 53

03.04.2018, 14:10:15 via Website

Muss ich nicht.
Ich probiere grad ein paar Sachen mit Bytes aus, einfach aus Interesse.
Hab mir dann einfach mal die Bytes eines Textes ausgeben lassen und die Umlaute sind mir ins Auge gesprungen. Da habe ich das mit den Blöcken (Lateinisch-1 Ergänzung) und dem Wertebereich von UTF-8 (1-4 Bytes) noch nicht so wirklich gewusst...
Ich habe es jetzt aber verstanden, das getBytes() natürlich dann für das 'ü' zwei Bytes liefert (in Ausgabe "-61 und -68" => "195 und 188").
Auch habe ich mir jetzt bischen was zu Unicode und UTF-8 angeschaut.

Das du dich wunderst, warum ich das Bytearray als Int umwandele ist vollkommen verständlich :D.
Es diente aber lediglich zur Ausgabe meiner "Experimente", also keine Sorge...

Vielen Dank nochmal. Ich bin irgendwie auf "252, 'unsigned byte', ect." gekommen...

Hilfreich?
Diskutiere mit!
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.166

03.04.2018, 14:16:09 via App

Ok wenn das keinen größeren Sinn hatte ist klar warum ;)
Aber wenn du es verstanden hast um so besser :)

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Diskutiere mit!

Empfohlene Artikel