2012-12-14 17 views
8

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 :)

+0

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

+0

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

+0

Masz więcej pomysłów do dodania? Być może powinienem zapytać w Eclipse, czy jest to problem IDE ..? – kwah

Odpowiedz

2

Wygląda na to, że konsola nie odczytuje poprawnie danych wejściowych. Oto link, który moim zdaniem opisuje Twój problem i rundy robocze.

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

prosta odpowiedź: Spróbuj ustawić zmienną środowiskową -Dfile.encoding = UTF-8 w eclipse.ini. (Przed włączeniem tego dla całego zaćmienia, może po prostu spróbuj ustawić to w configurtion debugowania dla tego programu i sprawdzić, czy to działa)

Łącze ma dużo więcej sugestii

+0

@kwah, czy wypróbowałeś tę sugestię? – Zenil

+1

Mogę potwierdzić, że początkowe testy dodawania '-Dfile.encoding = UTF-8' do' eclipse.ini' wydają się działać! :) Zaznaczę to jako poprawną odpowiedź za dzień lub dwa, gdy będę miał okazję przetestować to dokładniej niż tylko wstępne testy. – kwah

+0

Czy masz pojęcie, dlaczego Eclipse potrzebuje zmiennej środowiskowej, aby rozpoznać wejście nieobsługujące kodu Unicode? – kwah

1

Spróbuj tego: w Eclipse, kliknij prawym przyciskiem swoją główną klasę i kliknij polecenie Uruchom jako> Uruchom konfiguracjach. Następnie przejdź do wspólnej karty i zmień kodowanie na UTF-8. To powinno działać!

+0

Wygląda na to, że nie pomaga - było już UTF-8 – kwah

0

To wydaje się być problemem kodowania . Mogą być tu dwa problemy: 1. Nie aktywowałeś kompilacji odczytu niczego poza znakami ASCII, w twoim przypadku musisz móc czytać znaki UTF-8. 2. Być może zostały usunięte niektóre pakiety językowe? Jest to mało prawdopodobne, skoro prawdopodobnie umiesz pisać chińskie znaki?

Powinieneś przeszukać i dowiedzieć się, jak możesz IDE poprawnie skompilować znaki spoza ASCII. W pythonie odbywa się to w samym kodzie, nie jestem pewien, jak to zrobić w Javie.

Powiązane problemy