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 :)
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
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
Haben Sie noch weitere Gedanken dazu? Vielleicht sollte ich bei Eclipse nachfragen, ob es ein IDE-Problem ist ..? – kwah