Java ist Zeichensätze / Zeichenkodierung
Ich habe eine Datei in Spanisch, so ist es voll von Zeichen wie:
á é í ó ú ñ Ñ Á É Í Ó Ú
Ich habe die Datei gelesen, so dass ich dies tun:
fr = new FileReader(ficheroEntrada);
BufferedReader rEntrada = new BufferedReader(fr);
String linea = rEntrada.readLine();
if (linea == null) {
logger.error("ERROR: Empty file.");
return null;
}
String delimitador = "[;]";
String[] tokens = null;
List<String> token = new ArrayList<String>();
while ((linea = rEntrada.readLine()) != null) {
//Some parsing specific to my file.
tokens = linea.split(delimitador);
token.add(tokens[0]);
token.add(tokens[1]);
}
logger.info("List of tokens: " + token);
return token;
Wenn ich die Liste der Token, die alle Sonderzeichen sind verschwunden und ersetzt worden durch diese Art von Zeichen:
Ó = Ó
Ñ = Ñ
Und so weiter...
Was ist passiert? Ich hatte noch nie Probleme mit den Zeichensätzen (ich ' m vorausgesetzt, ist ein charset-Problem). Ist es, weil von diesem computer? Was kann ich tun?
Irgendwelche zusätzlichen Ratschläge werden geschätzt, ich bin zu lernen! Danke!!!
Verwenden
InputStreamReader
und geben Sie die entsprechende Codierung. FileReader
übernehmen "Standard" - Codierung, damit es nicht zu entschlüsseln, die Zeichen richtig.
InformationsquelleAutor coconut | 2012-11-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie angeben, Verwandte Zeichenkodierung.
InformationsquelleAutor kosa
Den Antworten empfehle das Lesen und schreiben von UTF-8-Codierung sollte dein problem lösen. Meine Antwort ist mehr über das, was passiert ist und wie zu diagnostizieren, ähnliche Probleme in der Zukunft.
Der erste Platz zu starten ist mit dem Zeichensatz UTF-8 Tabelle an http://www.utf8-chartable.de. Es ist ein drop-down auf der Seite, die ermöglicht das durchsuchen verschiedener Teile des Unicode. Eines Ihrer problem-Zeichen ist
Ó
. Die überprüfung der chart zeigt, dass, wenn Ihre Datei wurde in UTF-8 codiert, dann wird der Charakter wirdU+00D3 LATIN CAPITAL LETTER O WITH ACUTE
- und UTF-8-Sequenz besteht aus zwei bytes, hexc3 93
Nun schauen wir uns die ISO-8859-1 Zeichensatz an http://en.wikipedia.org/wiki/ISO/IEC_8859-1, da dies auch ein beliebtes Zeichen gesetzt. Dies ist jedoch einer dieser single-byte-Zeichensätze. Jedes gültige Zeichen wird dargestellt durch ein einzelnes byte, im Gegensatz zu UTF-8, wo ein Zeichen dargestellt werden kann durch 1, 2 oder 3 bytes.
Beachten Sie, dass der Charakter beim C3 aussieht à aber es gibt kein Zeichen an der 93. Also dein Standard-encoding ist wahrscheinlich nicht ISO-8859-1.
Nächsten lets check von Windows-1252 auf http://en.wikipedia.org/wiki/Windows-1252. Das ist fast das gleiche wie ISO-8859-1, sondern füllt in einige der leeren Räume mit nützlichen Zeichen. Und da haben wir eine übereinstimmung. Die Sequenz C3 93 in Windows-1252 ist genau die Zeichenkette
Ó
Was all dies sagt mir, dass Ihre Datei UTF-8 codiert ist jedoch die Java-Umgebung konfiguriert mit Windows-1252, als es die Standard-Codierung. Wenn Sie den code so ändern, geben Sie explizit den Zeichensatz ("UTF-8") anstatt der Standard-der code wird weniger wahrscheinlich zu scheitern, die auf verschiedenen Umgebungen.
Beachten Sie aber - dies kann ebenso leicht passiert den anderen Weg. Wenn Sie eine Datei von vor allem spanischen text, es könnte genauso leicht eine ISO-8859-1 oder Windows-1252-codierte Datei. In dem Fall Ihren code auf deinem Computer ausgeführt wird, wäre doch gut funktioniert hat und wechseln Sie zu Lesen "UTF-8" encoding hätte eine andere Gruppe von unlesbare Zeichen.
Dies ist Teil der Grund, Sie sind immer widersprüchliche Ratschläge. Verschiedene Leute hatten auch unterschiedliche Abweichungen basierend auf Ihrer Plattform, und so entdeckt habe verschiedene fixes.
Wenn Sie Zweifel haben, lese ich die Datei in emacs und wechseln Sie zu hexl-mode, so kann ich genau sehen binäre Daten in der Datei. Ich bin sicher, es gibt bessere und modernere Möglichkeiten, dies zu tun.
Ein letzter Gedanke - es könnte sich lohnen zu Lesen Das Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!
InformationsquelleAutor Guido Simone
Haben Sie das default-encoding falsch. Sie brauchen wahrscheinlich zu Lesen UTF8 oder latin1. Sehen Sie dieses snippet zum einstellen der Kodierung auf streams. Siehe auch Java Standard-Kodierung
InformationsquelleAutor RobAu
In meiner Erfahrung, die text-Datei soll gelesen und geschrieben werden auf der Grundlage westlicher encoding: ISO-8859-1.
BufferedReader rEntrada = new BufferedReader(
new InputStreamReader(new FileInputStream(fr), "ISO-8859-1"));
Du bist herzlich willkommen.Es ist gut zu wissen, dass es funktioniert.
InformationsquelleAutor Thinhbk
Die anderen Antworten stellen Ihnen eine richtige Richtung. Wollte nur hinzufügen, dass Guave mit seinen - Dateien.newReader(Datei -, Zeichensatz) Helfer-Methode macht die Schaffung einer solchen BufferedReader viel gelesen (verzeihen Sie das Wortspiel):
InformationsquelleAutor ShyJ