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 :)
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
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
Altri pensieri da aggiungere a questo? Forse dovrei chiedere ad Eclipse di vedere se si tratta di un problema IDE ..? – kwah