Ошибка кодирования при попытке чтения и записи в HTML-файл с Java - PullRequest
0 голосов
/ 18 августа 2010

Я пытаюсь прочитать какой-то текст из html-файла, изменить его определенным образом и записать результат в новый html-файл. Но проблема в том, что текст не написан на английском языке, и в результате некоторые символы заменяются на черно-белые "?" Метки. В моем HTML-файле у меня есть < meta http-equiv="Content-Type" content="text/html; charset=utf-8">. Что я делаю неправильно? Может быть, не те читатели и писатели?

StringBuilder sb = new StringBuilder();
BufferedReader br = new BufferedReader(new FileReader("inputFile.html"));
String line;
while ( (line = br.readLine()) != null) {
     sb.append(line);
}
String result = doSomeChanges(sb);
BufferedWriter out = new BufferedWriter(new FileWriter("outputFile.html")); 
out.write(result); 
out.close(); 

Ответы [ 4 ]

5 голосов
/ 18 августа 2010

Может быть, не те читатели и писатели?

Точно.FileReader и FileWriter являются мусором;забудь, что они существуют.Они неявно используют кодировку платформы по умолчанию и не позволяют переопределить это значение по умолчанию.

Вместо этого используйте это:

BufferedReader br = new BufferedReader(
    new InputStreamReader(new FileInputStream("inputFile.html"), "UTF-8"));

BufferedWriter out = new BufferedWriter(
    new OutputStreamWriter(new FileOutputStream("outputFile.html"), "UTF-8"));
2 голосов
/ 18 августа 2010

FileReader и FileWriter используют кодировку платформы по умолчанию, что здесь не то, что вам нужно. (Я всегда рассматривал это как фатальный недостаток в этих API.)

Вместо этого используйте FileInputStream и FileOutputStream, завернутые в InputStreamReader и OutputStreamWriter соответственно. Это позволяет вам явно установить кодировку - которая в этом случае должна быть UTF-8.

1 голос
/ 18 августа 2010

Чтобы упростить жизнь, вы также можете использовать FileUtils из проекта Apache Commons IO , который имеет методы чтения и записи для файлов и строк, которые учитывают кодировку.

1 голос
/ 18 августа 2010

Вы используете BufferedReader, который игнорирует html-структуру файла.Вот почему <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> не имеет никакого эффекта.

Попробуйте это:

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("zzz"), "utf8")));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...