3 Stimmen

Java, Scanner zur Eingabe von Zeichen als UTF-8, kann Text nicht drucken

Ich kann String in Array als UTF-8 konvertieren, aber ich kann es nicht zurück in String konvertieren, wie der erste String.

public static void main(String[] args) {

    Scanner h = new Scanner(System.in);
    System.out.println("INPUT : ");
    String stringToConvert = h.nextLine();
    byte[] theByteArray = stringToConvert.getBytes();

    System.out.println(theByteArray);
    theByteArray.toString();
    String s = new String(theByteArray);

    System.out.println(""+s);
}

Wie kann ich drucken theByteArray als Zeichenfolge?

12voto

Joe Punkte 1003
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);

2voto

Jake Greene Punkte 5371

Es gibt mehrere Probleme mit dem bereitgestellten Code:

  1. Sie stellen nicht sicher, dass Sie das UTF-8-Byte-Array von diesem String erhalten.

    byte[] theByteArray = stringToConvert.getBytes();

    gibt ein Byte-Array mit der Standardkodierung auf der angegebenen Plattform zurück, wie sie von der JavaDoc . Was Sie eigentlich tun wollen, ist Folgendes:

    byte[] theByteArray = stringToConvert.getBytes("UTF-8");
  2. Sie sollten die Dokumentation para System.out.println() :

    System.out.println(theByteArray);

    ruft System.out.println(Object x) die die Ergebnisse von x.toString() . Standardmäßig gibt toString() die Speicheradresse des angegebenen Objekts zurück.

    Wenn Sie also eine Ausgabe in der Form:

    EINGABE :

    [B@5f1121f6

    inputText

    Was Sie sehen, ist die Speicherposition des ByteArrays und dann die angegebene Eingabezeile.

  3. Sie scheinen die Methode "x.toString()" nicht zu verstehen. Erinnern Sie sich: Strings in Java sind unveränderlich Keine der Methoden von String verändert den String. theByteArray.toString(); gibt zurück. eine String-Darstellung von theByteArray; . Der zurückgegebene Wert wird verworfen, es sei denn, Sie geben den Wert einem anderen String

    String arrayAsString = theByteArray.toString();

    Wie bereits beschrieben, ist der zurückgegebene String jedoch der Speicherort von theByteArray . Zum Ausdrucken des Inhalts von theByteArray müssen Sie ihn in einen String umwandeln

    String convertedString = new String(theByteArray, Charset.forName("UTF-8"));

Angenommen, Wenn Sie die konvertierte Zeichenkette und anschließend die ursprüngliche Zeichenkette drucken möchten, sollte Ihr Code etwa so aussehen:

public static void main(String[] args) {

    Scanner h = new Scanner(System.in);
    System.out.println("INPUT : ");
    String stringToConvert = h.nextLine();

    try {
        // Array of the UTF-8 representation of the given String
        byte[] theByteArray;
        theByteArray = stringToConvert.getBytes("UTF-8");

        // The converted String
        System.out.println(new String(theByteArray, Charset.forName("UTF-8")));
    } catch (UnsupportedEncodingException e) {
        // We may provide an invalid character set
        e.printStackTrace();
    }

    // The original String
    System.out.println(stringToConvert);
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X