2012-12-14 19 views
8

Ich habe Mühe, Eclipse richtig in chinesischen Schriftzeichen zu lesen, und ich bin mir nicht sicher, wo ich falsch liegen könnte.Java-Konsole liest keine chinesischen Schriftzeichen korrekt

Genauer gesagt, irgendwo zwischen dem Lesen einer Kette von Chinesisch (vereinfacht oder traditionell) von der Konsole und der Ausgabe wird es verstümmelt. Auch bei der Ausgabe einer großen Zeichenfolge mit gemischtem Text (englische/chinesische Zeichen) scheint nur das Aussehen der chinesischen Zeichen geändert zu werden.

Ich habe es auf das folgende Testbeispiel heruntergeschnitten und es explizit kommentiert mit dem, was ich glaube, passiert in jeder Phase - beachten Sie, dass ich ein Student bin und sehr gerne mein Verständnis (oder sonst) bestätigen möchte :)

public static void main(String[] args) {  
    try 
    { 
     boolean isRunning = true; 

     //Raw flow of input data from the console 
     InputStream inputStream = System.in; 
     //Allows you to read the stream, using either the default character encoding, else the specified encoding; 
     InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8"); 
     //Adds functionality for converting the stream being read in, into Strings(?) 
     BufferedReader input_BufferedReader = new BufferedReader(inputStreamReader); 


     //Raw flow of outputdata to the console 
     OutputStream outputStream = System.out; 
     //Write a stream, from a given bit of text 
     OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream, "UTF-8"); 
     //Adds functionality to the base ability to write to a stream 
     BufferedWriter output_BufferedWriter = new BufferedWriter(outputStreamWriter); 



     while(isRunning) { 
      System.out.println();//force extra newline 
      System.out.print("> "); 

      //To read in a line of text (as a String): 
      String userInput_asString = input_BufferedReader.readLine(); 

      //To output a line of text: 
      String outputToUser_fromString_englishFromCode = "foo"; //outputs correctly 
      output_BufferedWriter.write(outputToUser_fromString_englishFromCode); 
      output_BufferedWriter.flush(); 

      System.out.println();//force extra newline 

      String outputToUser_fromString_ChineseFromCode = "之謂甚"; //outputs correctly 
      output_BufferedWriter.write(outputToUser_fromString_ChineseFromCode); 
      output_BufferedWriter.flush(); 

      System.out.println();//force extra newline 

      String outputToUser_fromString_userSupplied = userInput_asString; //outputs correctly when given English text, garbled when given Chinese text 
      output_BufferedWriter.write(outputToUser_fromString_userSupplied); 
      output_BufferedWriter.flush(); 

      System.out.println();//force extra newline 

     } 
    } 
    catch (Exception e) { 
     // TODO: handle exception 
    } 
} 

Beispielausgabe:

> 之謂甚 
foo 
之謂甚 
之謂甚 

> oaea 
foo 
之謂甚 
oaea 

> mixed input - English: fubar; Chinese: 之謂甚; 
foo 
之謂甚 
mixed input - English: fubar; Chinese: 之謂甚; 

> 

Was auf dieser Stack-Überlauf Post gesehen paßt genau das, was ich in der Eclipse-Konsole sehen und was in dem Eclipse-Debugger (beim Betrachten/Editieren des Variablenwertes) zu sehen ist . Wenn Sie die Variablenwerte manuell über den Eclipse-Debugger ändern, verhält sich der Code abhängig von diesem Wert so, wie ich es normalerweise erwarte. Dies legt nahe, dass es sich um ein Problem handelt, bei dem der Text gelesen wird.

Ich habe viele verschiedene Kombinationen von Scannern/gepufferten Streams [Reader | Writer] s usw. zum Ein- und Auslesen mit und ohne explizite Zeichentypen ausprobiert, obwohl dies nicht besonders systematisch gemacht wurde und leicht etwas verpasst hätte.

Ich habe versucht, die Eclipse-Umgebung auf UTF-8 zu setzen, wo immer es möglich ist, aber ich könnte einen oder zwei Plätze verpasst haben. Beachten Sie, dass die Konsole hartcodierte chinesische Zeichen korrekt ausgibt.

Jede Hilfe/Hinweise zu diesem Thema ist sehr zu schätzen :)

+0

System.out ist ein ['PrintStream'] (http://docs.oracle.com/javase/6/docs/api/java/io/PrintStream.html), das byteweise funktioniert. Sie müssen es in einen ['PrintWriter'] (http://docs.oracle.com/javase/6/docs/api/java/io/PrintWriter.html) oder einen [' OutputStreamWriter'] umbrechen (http://docs.oracle.com/javase/6/docs/api/java/io/OutputStreamWriter.html), um sie als Zeichen auszugeben, weshalb userInput falsch ausgegeben wird. – Powerlord

+0

Ich fürchte, ich bin hier ziemlich naiv, ich bin dabei, die Frage zu bearbeiten - bitte helfen Sie mir zu verstehen, wo Sie glauben, dass die Verwendung eines Ausgabeschreibers zur Ausgabe eines Wertes (an dieser Stelle als String gespeichert) hilfreich ist . – kwah

+0

Haben Sie noch weitere Gedanken dazu? Vielleicht sollte ich bei Eclipse nachfragen, ob es ein IDE-Problem ist ..? – kwah

Antwort

2

Es sieht so aus, als würde die Konsole die Eingabe nicht korrekt lesen. Hier ist ein Link, den ich glaube, beschreibt Ihr Problem und Arbeits-Runden.

http://paranoid-engineering.blogspot.com/2008/05/getting-unicode-output-in-eclipse.html

Einfache Antwort: Versuchen Sie, die Umgebungsvariable Einstellung -Dfile.encoding = UTF-8 in Ihrem eclipse.ini. (Vor diesem ermöglicht, für ganze Finsternis, könnte man nur versuchen, dies in den Debug-configurtion für dieses Programm einstellen und sehen, ob es funktioniert)

Der Link hat viel mehr Vorschläge

+0

@kwah hast du diesen Vorschlag versucht? – Zenil

+1

Ich kann bestätigen, dass die ersten Tests zum Hinzufügen von '-Dfile.encoding = UTF-8' zu' eclipse.ini' scheinbar funktionieren! :) Ich werde es an ein oder zwei Tagen als die richtige Antwort bezeichnen, wenn ich die Gelegenheit hatte, das genauer zu testen als nur die ersten Tests. – kwah

+0

Haben Sie eine Idee, warum Eclipse eine Umgebungsvariable benötigt, um Nicht-Unicode-Eingaben zu erkennen? – kwah

1

Try this: in Eclipse, rechts Hauptklasse klicken und klicken Sie auf Ausführen als> laufen Konfigurationen. Wechseln Sie dann zur Registerkarte "Allgemein" und ändern Sie die Codierung in UTF-8. Das sollte funktionieren!

+0

Scheint nicht zu helfen - es war schon UTF-8 – kwah

0

Dies scheint eine Codierung Problem zu sein . Hier können zwei Probleme auftreten: 1. Sie haben die Fähigkeit des Compilers, außer ASCII-Zeichen zu lesen, nicht aktiviert. In Ihrem Fall müssen Sie UTF-8-Zeichen lesen können. 2. Sie haben möglicherweise bestimmte Sprachpakete gelöscht? Dies ist unwahrscheinlich, da Sie wahrscheinlich chinesische Schriftzeichen schreiben können?

Sie sollten suchen und lernen, wie Sie Ihre IDE die Nicht-ASCII-Zeichen korrekt kompilieren können. In Python wird dies im Code selbst gemacht, ich bin mir nicht sicher, wie es in Java gemacht wird.

Verwandte Themen