Коррупция персонажа, идущая из буферреджера на буферритр в Java
-
01-10-2019 - |
Вопрос
В Java я пытаюсь анализировать файл HTML, который содержит сложный текст, такой как греческие символы.
Я столкнулся с известной проблемой, когда текст содержит левую облицовочную цитату. Текст такой как
mutations to particular “hotspot” regions
становится
mutations to particular “hotspot�? regions
У меня была изолирована проблема, написав простую копию текста Meathood:
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;
}
}
Кто-нибудь может предложить несколько советов, как исправить эту проблему?
★ Мое решение
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();
Решение
Файл чтения не находится в том же кодировке (возможно UTF-8) в качестве файла, написанного (вероятно, ISO-8859-1).
Попробуйте следующее, чтобы генерировать файл с кодировкой UTF-8:
BufferedWriter output = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outputFile),"UTF8"));
К сожалению, определение кодирования файла очень сложно. Видеть Java: Как определить правильное кодирование кабриогития потока
Другие советы
В дополнение к тому, что писал Тьерри-Димитрий Рой, если вы знаете кодировку, вы должны создать FialeReader с небольшим количеством дополнительной работы. Из документов:
Удобство класса для чтения файлов символов. Конструкторы этого класса предполагают, что кодирование символов по умолчанию и размер буфера по умолчанию. Чтобы указать эти значения самостоятельно, постройте INPUTSSTREAMREADER на FileInPutStream.
То Javadoc for. FileReader
говорит:
Конструкторы этого класса предполагают, что кодирование символов по умолчанию и размер буфера по умолчанию. Чтобы указать эти значения самостоятельно, постройте INPUTSSTREAMREADER на FileInPutStream.
В вашем случае, что кодировка символов по умолчанию, вероятно, нет соответствующий. Найдите, что кодирует файл ввода, и укажите его. Например:
FileInputStream fis = new FileInputStream(myFile);
InputStreamReader isr = new InputStreamReader(fis, "charset name goes here");
BufferedReader input = new BufferedReader(isr);