Perché Java BufferedReader () non legge correttamente i caratteri arabi e cinesi?

Sto provando a leggere un file che contiene caratteri inglese e arabo su ogni riga e un altro file che contiene caratteri inglesi e cinesi su ogni riga. Tuttavia, i caratteri dell’arabo e del cinese non vengono visualizzati correttamente: appaiono semplicemente come punti interrogativi. Qualche idea su come posso risolvere questo problema?

Ecco il codice che uso per leggere:

try { String sCurrentLine; BufferedReader br = new BufferedReader(new FileReader(directionOfTargetFile)); int counter = 0; while ((sCurrentLine = br.readLine()) != null) { String lineFixedHolder = converter.fixParsedParagraph(sCurrentLine); System.out.println("The line number "+ counter + " contain : " + sCurrentLine); counter++; } } 

Edizione 01

Dopo aver letto la riga e ottenuto la parola araba e cinese, utilizzo una funzione per tradurli semplicemente ricercando il testo arabo fornito in una ArrayList (che contiene tutte le parole previste) (utilizzando il metodo indexOf (); Quindi, quando viene trovato l’indice della parola, viene usato per chiamare la parola inglese che ha lo stesso indice in un altro Arraylist. Tuttavia questa ricerca restituisce sempre false perché non riesce durante la ricerca dei punti interrogativi al posto dei caratteri arabi e cinesi. Quindi la mia stampa System.out.println mi mostra i valori nulli, uno per ogni errore da tradurre.

* Sto usando Netbeans 6.8 Mac IDE versione


Edizione 02

Ecco il codice che cerca la traduzione:

  int testColor = dbColorArb.indexOf(wordToTranslate); int testBrand = -1; if ( testColor != -1 ) { String result = (String)dbColorEng.get(testColor); return result; } else { testBrand = dbBrandArb.indexOf(wordToTranslate); } //System.out.println ("The testBrand is : " + testBrand); if ( testBrand != -1 ) { String result = (String)dbBrandEng.get(testBrand); return result; } else { //System.out.println ("The first null"); return null; } 

In realtà sto cercando 2 arraylists che potrebbero contenere la parola desiderata da tradurre. Se non riesce a trovarli in entrambi gli ArrayList, viene restituito il valore null.


Edizione 03

Quando eseguo il debug, ho trovato che le righe da leggere sono memorizzate nella mia variabile String come segue:

  "3;0000000000;0000001001;1996-06-22;;2010-01-27;    ;;01989;      ;" 

Edizione 03

Il file che sto leggendo mi è stato dato dopo che è stato modificato da un altro programma (di cui non so nulla a parte averlo realizzato in VB) il programma ha fatto apparire le lettere arabe che non appaiono correttamente. Quando ho controllato la codifica del file su Notepad ++ ha dimostrato che è ANSI. tuttavia quando lo converto in UTF8 (che sostituisce la lettera araba con un’altra inglese) e poi lo converto in ANSI, l’arabo diventa un punto interrogativo!

FileReader javadoc :

Classe di convenienza per la lettura di file di caratteri. I costruttori di questa class presumono che la codifica dei caratteri di default e la dimensione del buffer del byte di default siano appropriate. Per specificare da soli questi valori, costruisci un InputStreamReader su un FileInputStream.

Così:

 Reader reader = new InputStreamReader(new FileInputStream(fileName), "utf-8"); BufferedReader br = new BufferedReader(reader); 

Se ancora non funziona, forse la tua console non è impostata per visualizzare correttamente i caratteri UTF-8. La configurazione dipende dall’IDE utilizzato ed è piuttosto semplice.

Aggiornamento: nel codice precedente sostituire utf-8 con cp1256 . Questo funziona bene per me (WinXP, JDK6)

Ma ti consiglio di insistere sul file generato utilizzando UTF-8. Perché cp1256 non funzionerà per il cinese e avrai di nuovo problemi simili.

È molto probabile che IT stia leggendo correttamente le informazioni, tuttavia il stream di output probabilmente non è UTF-8, quindi qualsiasi carattere che non può essere mostrato nel set di caratteri di output viene sostituito con “?”.

Puoi confermare questo facendo uscire ogni carattere e stampando il carattere ordinale.

 public void writeTiFile(String fileName,String str){ try { FileOutputStream out = new FileOutputStream(fileName); out.write(str.getBytes("windows-1256")); } catch (Exception ex) { ex.printStackTrace(); } }