2012-04-02 7 views
4

Ich kann String in Array als UTF-8 konvertieren, aber ich kann nicht zurück in String wie der erste String konvertieren.Java, die Verwendung von Scanner zur Eingabe von Zeichen als UTF-8, kann keinen Text ausgeben

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 theByteArray als String drucken?

+0

Sieht aus wie es mir funktioniert gut: http://ideone.com/rcvXl – mellamokb

+0

Testeingang/erwartete Ausgabe/Ist-Ausgang sorgen. –

Antwort

12
String s = new String(theByteArray); 

wirklich

sein sollte
String s = new String(theByteArray, Charset.forName("UTF-8")); 

Das zugrunde liegende Problem hier ist, dass String-Konstruktoren nicht intelligent sind. Der Zeichenfolgenkonstruktor kann den Zeichensatz, der verwendet wird, nicht unterscheiden und wird versuchen, ihn unter Verwendung des Systemstandards zu konvertieren, der im Allgemeinen etwas wie ASCII oder ISO-8859-1 ist. Deshalb sieht normales A-Za-z richtig aus, aber dann fängt alles andere an zu versagen.

Byte ist ein Typ, der von -127 bis 127 läuft, daher müssen für die UTF-8-Konvertierung aufeinanderfolgende Bytes verkettet werden. Es ist unmöglich für den String-Konstruktor, dies von einem Byte-Array zu unterscheiden, so dass es standardmäßig jedes Byte einzeln behandelt (weshalb also grundlegende alphanumerische Zeichen immer funktionieren, wenn sie in diesen Bereich fallen).

Beispiel:

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); 
+0

+1 Ich habe den Charset.forName ("UTF-8") in meiner eigenen Antwort verpasst –

2

Es gibt mehrere Probleme mit dem mitgelieferten Code:

  1. Sie gewährleisten nicht, dass Sie den UTF-8-Byte-Array aus diesem String bekommen.

    byte[] theByteArray = stringToConvert.getBytes(); 
    

    gibt ein Byte-Array mit der Standard-Codierung auf der gegebenen Plattform, wie sie in der JavaDoc beschrieben. Was Sie wirklich wollen, zu tun, ist die folgende:

    byte[] theByteArray = stringToConvert.getBytes("UTF-8"); 
    
  2. Sie überprüfen sollten, die documentation für System.out.println():

    System.out.println(theByteArray); 
    

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

    bei der Ausgabe des Formulars sehen:

    INPUT:

    [B @ 5f1121f6

    input

    Was Sie sehen, ist der Speicherplatz von theByteArray und dann die gegebene Eingabezeile des Textes.

  3. Sie scheinen die 'x.toString()' Methode nicht zu verstehen. Denken Sie daran, Strings in Java sind immutable; Keine der Methoden von String ändert die Zeichenfolge. theByteArray.toString();gibt eine Zeichenfolgendarstellung von theByteArray; zurück. Der zurückgegebene Wert wird verworfen, wenn Sie den Wert auf einem anderen String

    String arrayAsString = theByteArray.toString(); 
    

    jedoch geben, wie zuvor beschrieben, wird der zurückgegebene String der Speicherplatz von theByteArray sein.Um den Inhalt von theByteArray auszudrucken, müssen Sie es in einen String

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

Unter der Annahme, Ihre Anforderungen umzusetzen sind, um die konvertierten String drucken und dann das Original String drucken, sollten Sie Ihren Code in 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); 
} 
+0

vielen Dank. U sagen sehr einfach zu wissen, aber dieser Code funktioniert. Wie meine Beispieleingabe: Bác (basierend auf der Sprache Vietnam), nach der Konvertierung zurück in String, sehe ich nur das Quadrat -.- ' – famfamfam

+0

Sie haben Recht. Ich korrigierte meinen Fehler mit Joes Antwort. –

Verwandte Themen