2012-12-14 15 views
8

Sto lottando per far sì che Eclipse legga correttamente i caratteri cinesi, e non sono sicuro di dove potrei sbagliare.La console Java non sta leggendo correttamente in caratteri cinesi

In particolare, da qualche parte tra la lettura di una stringa di cinese (semplificata o tradizionale) dalla console e la sua emissione, viene confusa. Anche quando si emette una grande stringa di testo misto (caratteri inglese/cinese), sembra modificare solo l'aspetto dei caratteri cinesi.

L'ho ridotto al seguente esempio di test e l'ho annotato esplicitamente con quello che credo stia accadendo in ogni fase - nota che sono uno studente e vorrei molto confermare la mia comprensione (o meno) :)

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 
    } 
} 

Esempio di output:

> 之謂甚 
foo 
之謂甚 
之謂甚 

> oaea 
foo 
之謂甚 
oaea 

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

> 

ciò che si vede in questa Stack Overflow messaggio corrisponde esattamente quello che vedo nella console Eclipse e ciò che si vede all'interno del debugger Eclipse (durante la visualizzazione/modifica dei valori delle variabili) . La modifica manuale dei valori delle variabili tramite il debugger Eclipse determina il comportamento del codice a seconda del valore in cui normalmente mi aspetterei, suggerendo che è il modo in cui il testo viene letto IN che rappresenta un problema.

Ho provato diverse combinazioni di scanner/flusso bufferizzato [reader | writer] ecc. Per leggere ed esportare, con e senza tipi di caratteri espliciti anche se questo non è stato eseguito in modo particolarmente sistematico e potrebbe facilmente aver perso qualcosa.

Ho provato a impostare l'ambiente Eclipse per utilizzare UTF-8 ovunque possibile, ma suppongo che avrei potuto perdere un posto o due .. Si noti che la console produrrà correttamente caratteri cinesi hard-coded.

Qualsiasi tipo di assistenza/guida su questa materia è molto apprezzato :)

+0

System.out è un ['PrintStream'] (http://docs.oracle.com/javase/6/docs/api/java/io/PrintStream.html), che funziona byte per byte. È necessario avvolgerlo in un ['PrintWriter'] (http://docs.oracle.com/javase/6/docs/api/java/io/PrintWriter.html) o in un' [OutputStreamWriter'] (http://docs.oracle.com/javase/6/docs/api/java/io/OutputStreamWriter.html) per stamparlo come caratteri, motivo per cui userInput viene emesso in modo errato. – Powerlord

+0

Temo che potrei essere piuttosto ingenuo qui, sto per modificare la domanda - per favore aiutami a capire dove pensi che usare un writer di output per produrre un valore (a questo punto, memorizzato come una stringa) sarà di aiuto . – kwah

+0

Altri pensieri da aggiungere a questo? Forse dovrei chiedere ad Eclipse di vedere se si tratta di un problema IDE ..? – kwah

risposta

2

Sembra che la console non stia leggendo correttamente l'input. Ecco un link che credo descriva il tuo problema e work-rounds.

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

Semplice risposta: Prova impostando la variabile ambientale -Dfile.encoding = UTF-8 nel vostro eclipse.ini. (Prima di attivare questo per tutta l'Eclipse, si può solo provare ad impostare questo nel configurtion debug per questo programma e vedere se funziona)

Il collegamento ha molto di più suggerimenti

+0

@kwah hai provato questo suggerimento? – Zenil

+1

Posso confermare che i test iniziali dell'aggiunta di '-Dfile.encoding = UTF-8' a' eclipse.ini' sembrano funzionare! :) La contrassegnerò come la risposta corretta in un giorno o due quando avrò avuto la possibilità di testarlo in modo più approfondito rispetto ai test iniziali. – kwah

+0

Hai idea del motivo per cui Eclipse ha bisogno di una variabile di ambiente per riconoscere l'input non Unicode? – kwah

1

Prova questa: in Eclipse, fare clic destro la classe principale e scegliere Esegui come> configurazioni gestite. Quindi vai alla scheda comune e cambia la codifica in UTF-8. Questo dovrebbe funzionare!

+0

Non sembra essere d'aiuto - era già UTF-8 – kwah

0

Questo sembra essere un problema di codifica . Potrebbero esserci due problemi qui: 1. Non hai attivato la capacità del compilatore di leggere nulla tranne i caratteri ASCII, nel tuo caso devi essere in grado di leggere i caratteri UTF-8. 2. È possibile che alcuni pacchetti linguistici siano stati cancellati? È improbabile dal momento che probabilmente sei in grado di scrivere caratteri cinesi?

Si dovrebbe cercare in giro e imparare come è possibile il tuo IDE per compilare correttamente i caratteri non-ASCII. In Python questo è fatto nel codice stesso, non sono sicuro di come sia fatto in Java.

Problemi correlati