Domanda

Sto cercando di leggere un file che contengono caratteri inglesi e arabi su ogni linea e un altro file che contiene inglese e caratteri cinesi su ogni linea. Tuttavia i personaggi del arabo e cinese non riescono a mostrare in modo corretto - appaiono come punti interrogativi. Qualsiasi idea di come posso risolvere questo problema?

Ecco il codice che uso per la lettura:

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 linea e ricevendo l'arabo e parola cinese io uso una funzione di tradurle semplicemente cercando Dato testo arabo in un ArrayList (che contengono tutte le parole che ci si attende) (utilizzando indexOf () ; metodo). Poi, quando si trova l'indice della parola è 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. Così la mia stampa System.out.println mi mostra i valori nulli, uno per ogni fallimento di tradurre.

* Sto usando Netbeans 6.8 versione per Mac IDE


Edizione 02

Ecco il codice che cerca per 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 trovare loro in entrambe le ArrayLists, quindi nulla viene restituito.


Edizione 03

Quando il debug ho scoperto che le linee essendo lettura sono memorizzati nella mia variabile String come il seguente:

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

Edizione 03

Il file che sto leggendo è stato dato a me dopo che è stato modificato da un altro programma (che non so nulla di fianco che è fatto in VB) il programma ha fatto le lettere arabe che non vengono visualizzati correttamente a comparire. Quando ho controllato la codifica del file sul Notepad ++ è emerso che si tratta di ANSI. tuttavia quando ho convertirlo in UTF8 (che ha sostituito la lettera araba con altri inglese uno) e poi riconvertirlo in ANSI i punti interrogativi diventare arabi!

È stato utile?

Soluzione

FileReader javadoc :

  

class Convenienza per la lettura di file di carattere. I costruttori di questa classe presuppongono che la codifica dei caratteri di default e la dimensione in byte del buffer di default sono appropriate. Per specificare questi valori da soli, costruire un InputStreamReader su un FileInputStream.

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

Se questo ancora non funziona, allora forse la console non è impostato per visualizzare correttamente caratteri UTF-8. Configurazione dipende dalla IDE utilizzato ed è piuttosto semplice.

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

Ma vi consiglio che ti ostini a file generato usando UTF-8. Perché cp1256 non funziona per il cinese e avrete ancora problemi simili.

Altri suggerimenti

E 'più probabile la lettura delle informazioni in modo corretto, ma il flusso di uscita non è probabilmente UTF-8, e così qualsiasi carattere che non può essere mostrato nel set di caratteri output viene sostituito con il '?'.

È possibile confermare questo ottenendo ogni personaggio e la stampa l'ordinale carattere.

public void writeTiFile(String fileName,String str){
    try {
        FileOutputStream out = new FileOutputStream(fileName);
        out.write(str.getBytes("windows-1256"));
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top