Charakter Korruption von BufferedReader zu BufferedWriter in Java gehen
-
01-10-2019 - |
Frage
In Java Ich versuche, eine HTML-Datei zu analysieren, die komplexen Text wie griechische Symbole enthält.
Ich begegne ein bekanntes Problem, wenn der Text ein nach links gegen Anführungszeichen enthält. Text wie
mutations to particular “hotspot” regions
wird
mutations to particular “hotspot�? regions
Ich habe das Problem isoliert durch einen einfachen Text-Kopie meathod writting:
public static int CopyFile()
{
try
{
StringBuffer sb = null;
String NullSpace = System.getProperty("line.separator");
Writer output = new BufferedWriter(new FileWriter(outputFile));
String line;
BufferedReader input = new BufferedReader(new FileReader(myFile));
while((line = input.readLine())!=null)
{
sb = new StringBuffer();
//Parsing would happen
sb.append(line);
output.write(sb.toString()+NullSpace);
}
return 0;
}
catch (Exception e)
{
return 1;
}
}
bieten kann jemand ein paar Ratschläge, wie man dieses Problem zu beheben?
? Meine Lösung
InputStream in = new FileInputStream(myFile);
Reader reader = new InputStreamReader(in,"utf-8");
Reader buffer = new BufferedReader(reader);
Writer output = new BufferedWriter(new FileWriter(outputFile));
int r;
while ((r = reader.read()) != -1)
{
if (r<126)
{
output.write(r);
}
else
{
output.write("&#"+Integer.toString(r)+";");
}
}
output.flush();
Lösung
Die Datei Lese ist nicht in der gleichen Codierung (wahrscheinlich UTF-8) als die Datei geschrieben (wahrscheinlich ISO-8859-1).
Versuchen Sie, die im Anschluss an eine Datei mit UTF-8-Codierung zu erzeugen:
BufferedWriter output = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outputFile),"UTF8"));
Leider ist die Codierung einer Datei bestimmen, ist sehr schwierig. Siehe Java: Wie die richtige charset bestimmen eines Stroms
Andere Tipps
Zusätzlich zu dem, was Thierry-Dimitri Roy schrieb, wenn Sie wissen, das Codieren Sie Ihre Filereader mit einem wenig zusätzlichen Arbeit. Aus der Dokumentation:
Convenience-Klasse zum Lesen Zeichendateien. Die Konstrukteure diese Klasse geht davon aus, dass der Standard Zeichencodierung und der Standard Byte-Puffergröße geeignet ist. Zu geben diese Werte selbst, eine Input auf ein Konstrukt, Fileinputstream.
Die Javadoc für FileReader
sagt :
Die Konstrukteure dieser Klasse gehen davon aus, dass die Standard-Zeichencodierung und die Standard-Byte-Puffergröße geeignet ist. Um diese Werte selbst festlegen, konstruiert einen Input auf einem Fileinputstream.
In Ihrem Fall der Standard-Zeichenkodierung ist wahrscheinlich nicht angemessen. Finden Sie, was die Eingabedatei verwendet codiert, und geben Sie es. Zum Beispiel:
FileInputStream fis = new FileInputStream(myFile);
InputStreamReader isr = new InputStreamReader(fis, "charset name goes here");
BufferedReader input = new BufferedReader(isr);