String s = new String(theByteArray);
sollte wirklich sein
String s = new String(theByteArray, Charset.forName("UTF-8"));
Das zugrundeliegende Problem hier ist, dass String-Konstruktoren nicht intelligent sind. Der String-Konstruktor kann den verwendeten Zeichensatz nicht unterscheiden und versucht, ihn anhand des Systemstandards zu konvertieren, der im Allgemeinen etwas wie ASCII oder ISO-8859-1 ist. Das ist der Grund, warum normale A-Za-z richtig aussieht, aber dann alles andere zu scheitern beginnt.
Byte ist ein Typ, der von -127 bis 127 reicht, so dass für die UTF-8-Konvertierung aufeinanderfolgende Bytes aneinandergereiht werden müssen. Es ist unmöglich für den String-Konstruktor, dies von einem Byte-Array zu unterscheiden, so dass er standardmäßig jedes Byte einzeln behandelt (daher funktionieren einfache alphanumerische Zeichen immer, da sie in diesen Bereich fallen).
Ejemplo:
String text = "";
byte[] array = text.getBytes("UTF-8");
String s = new String(array, Charset.forName("UTF-8"));
System.out.println(s); // Prints as expected
String sISO = new String(array, Charset.forName("ISO-8859-1")); // Prints 'ããã«ã¡ã¯'
System.out.println(sISO);