Staram się, aby Eclipse poprawnie czytał chińskie znaki, i nie jestem pewien, dokąd zmierza.Konsola Java nie czyta poprawnie chińskich znaków.
W szczególności, gdzieś pomiędzy odczytaniem ciągu chińskiego (uproszczonego lub tradycyjnego) z konsoli i wyprowadzeniem go, staje się zniekształcony. Nawet jeśli wypisujesz duży ciąg mieszanego tekstu (znaki angielskie/chińskie), wydaje się, że zmienia on tylko wygląd chińskich znaków.
Przytoczyłem poniższy przykład testowy i wyraźnie opatrzyłem go adnotacją z tym, co moim zdaniem dzieje się na każdym etapie - zauważ, że jestem studentem i bardzo chciałbym potwierdzić moje zrozumienie (lub w inny sposób) :)
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
}
}
Przykładowe wyjście:
> 之謂甚
foo
之謂甚
之謂甚
> oaea
foo
之謂甚
oaea
> mixed input - English: fubar; Chinese: 之謂甚;
foo
之謂甚
mixed input - English: fubar; Chinese: 之謂甚;
>
Co jest widoczne na tym przepełnienie stosu wątku pasuje dokładnie to, co widzę w konsoli Eclipse i co jest widoczne w debuggera Eclipse (podczas przeglądania/edycji wartości zmiennych) . Ręczna zmiana wartości zmiennych za pomocą debuggera Eclipse powoduje, że kod w zależności od wartości będzie zachowywał się tak, jak zwykle oczekiwałbym, sugerując, że jest to sposób, w jaki odczytany jest tekst.
Próbowałem wielu różnych kombinacji skanerów/buforowanych strumieni [czytnik | pisarz] itp. Do odczytu i wyprowadzania, z wyraźnymi typami znaków i bez nich, chociaż nie zostało to zrobione szczególnie systematycznie i mogło łatwo coś przeoczyć.
Próbowałem ustawić środowisko Eclipse tak, aby używało UTF-8 wszędzie tam, gdzie było to możliwe, ale przypuszczam, że mogłem pominąć to miejsce lub dwa. Zauważ, że konsola poprawnie wypisze zakodowane chińskie znaki.
Każda pomoc/wytyczne w tej sprawie jest bardzo mile widziane :)
System.out to ['PrintStream'] (http://docs.oracle.com/javase/6/docs/api/java/io/PrintStream.html), który działa bajt po bajcie. Musisz zawinąć go w ['PrintWriter'] (http://docs.oracle.com/javase/6/docs/api/java/io/PrintWriter.html) lub [' OutputStreamWriter'] (http://docs.oracle.com/javase/6/docs/api/java/io/OutputStreamWriter.html), aby wyprowadzić go jako znaki, dlatego userInput jest niepoprawnie wyprowadzany. – Powerlord
Obawiam się, że mogę być raczej naiwny tutaj, mam zamiar edytować pytanie - proszę, pomóż mi w zrozumieniu, gdzie uważasz, że używanie pisarza wyjściowego do wyprowadzania wartości (w tym momencie, przechowywany jako ciąg) będzie pomocne . – kwah
Masz więcej pomysłów do dodania? Być może powinienem zapytać w Eclipse, czy jest to problem IDE ..? – kwah