Frage

Ich versuche, eine Datei zu lesen, die in jeder Zeile englische und arabische Zeichen enthält, und eine andere Datei, die in jeder Zeile englische und chinesische Zeichen enthält.Allerdings werden die Zeichen des Arabischen und Chinesischen nicht richtig angezeigt – sie erscheinen lediglich als Fragezeichen.Irgendeine Idee, wie ich dieses Problem lösen kann?

Hier ist der Code, den ich zum Lesen verwende:

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

Ausgabe 01

Nachdem ich die Zeile gelesen und das arabische und chinesische Wort gefunden habe, verwende ich eine Funktion, um sie durch einfaches Suchen zu übersetzen Gegebener arabischer Text in einer ArrayList (die alle erwarteten Wörter enthält) (mit indexOf();Methode).Wenn dann der Index des Wortes gefunden wird, wird er verwendet, um das englische Wort aufzurufen, das denselben Index in einer anderen Arrayliste hat.Allerdings gibt diese Suche immer „false“ zurück, da sie fehlschlägt, wenn die Fragezeichen anstelle der arabischen und chinesischen Zeichen gesucht werden.Mein System.out.println-Druck zeigt mir also Nullen an, eine für jeden Übersetzungsfehler.

*Ich verwende die Netbeans 6.8 Mac-Versions-IDE


Ausgabe 02

Hier ist der Code, der nach einer Übersetzung sucht:

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

Ich suche tatsächlich nach 2 Arraylisten, die das gewünschte zu übersetzende Wort enthalten könnten.Wenn sie nicht in beiden ArrayLists gefunden werden, wird null zurückgegeben.


Ausgabe 03

Beim Debuggen habe ich festgestellt, dass die gelesenen Zeilen in meiner String-Variablen wie folgt gespeichert sind:

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

Ausgabe 03

Die Datei, die ich gerade lese, wurde mir gegeben, nachdem sie von einem anderen Programm geändert wurde (von dem ich nichts weiß, außer dass es in VB erstellt wurde). Das Programm hat dafür gesorgt, dass die arabischen Buchstaben, die nicht korrekt angezeigt werden, angezeigt werden.Als ich die Kodierung der Datei in Notepad++ überprüfte, zeigte sich, dass es sich um ANSI handelte.Wenn ich es jedoch in UTF8 konvertiere (wodurch der arabische Buchstabe durch einen anderen englischen ersetzt wird) und es dann wieder in ANSI konvertiere, wird das Arabisch zu Fragezeichen!

War es hilfreich?

Lösung

FileReader Javadoc:

Komfortklasse zum Lesen von Zeichendateien.Die Konstruktoren dieser Klasse gehen davon aus, dass die Standardzeichenkodierung und die Standardbytepuffergröße angemessen sind.Um diese Werte selbst anzugeben, erstellen Sie einen InputStreamReader für einen FileInputStream.

Also:

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

Wenn dies immer noch nicht funktioniert, ist Ihre Konsole möglicherweise nicht für die ordnungsgemäße Anzeige von UTF-8-Zeichen eingestellt.Die Konfiguration hängt von der verwendeten IDE ab und ist recht einfach.

Aktualisieren : Ersetzen Sie im obigen Code utf-8 mit cp1256.Das funktioniert gut für mich (WinXP, JDK6)

Ich würde Ihnen jedoch empfehlen, darauf zu bestehen, dass die Datei mit UTF-8 generiert wird.Weil cp1256 wird für Chinesisch nicht funktionieren und Sie werden wieder ähnliche Probleme haben.

Andere Tipps

Höchstwahrscheinlich werden die Informationen korrekt eingelesen, Ihr Ausgabestream ist jedoch wahrscheinlich nicht UTF-8 und daher werden alle Zeichen, die in Ihrem Ausgabezeichensatz nicht angezeigt werden können, durch „?“ ersetzt.

Sie können dies bestätigen, indem Sie jedes Zeichen herausnehmen und die Zeichen-Ordinalzahl ausgeben.

public void writeTiFile(String fileName,String str){
    try {
        FileOutputStream out = new FileOutputStream(fileName);
        out.write(str.getBytes("windows-1256"));
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top