2015-04-23 1 views
3

Я пытаюсь записать файл, содержащий некоторые немецкие символы, на диск и прочитать его с использованием кодировки Windows-1252. Я не понимаю, почему, но мой результат выглядит следующим образом:Чтение и запись файла с окнами-1252

<title>W�hrend und im Anschluss an die Exkursion stehen Ihnen die Ansprechpartner f�r O-T�ne</title> 

<p>Die Themen im �berblick</p> 

Любые мысли? Вот мой код. Вам понадобится пружинный ядро ​​и commons-io для запуска.

private static void write(String fileName, Charset charset) throws IOException { 
    String html = "<html xmlns=\"http://www.w3.org/1999/xhtml\">" + 
        "<head>" + 
        "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1252\">" + 
        "<title>Während und im Anschluss an die Exkursion stehen Ihnen die Ansprechpartner für O-Töne</title>" + 
        "</head>" + 
        "<body>" + 
        "<p>Die Themen im Überblick</p>" + 
        "</body>" + 
        "</html>"; 

    byte[] bytes = html.getBytes(charset); 
    FileOutputStream outputStream = new FileOutputStream(fileName); 
    OutputStreamWriter writer = new OutputStreamWriter(outputStream, charset); 
    IOUtils.write(bytes, writer); 
    writer.close(); 
    outputStream.close(); 
} 

private static void read(String file, Charset windowsCharset) throws IOException { 
    ClassPathResource pathResource = new ClassPathResource(file); 
    String string = IOUtils.toString(pathResource.getInputStream(), windowsCharset); 
    System.out.println(string); 
} 

public static void main(String[] args) throws IOException { 
    Charset windowsCharset = Charset.forName("windows-1252"); 
    String file = "test.txt"; 
    write(file, windowsCharset); 
    read(file, windowsCharset); 
} 

ответ

1

Ваш метод записи неверен. Вы используете писатель для записи байт. Писатель должен использоваться для написания символов или строк.

Вы уже закодированный строку в байты с линией

byte[] bytes = html.getBytes(charset); 

Эти байты просто могут быть записаны в выходной поток:

IOUtils.write(bytes, outputStream); 

Это делает писатель ненужным (удалить его), и вы теперь получит правильный результат.

+0

Кажется не работает. Мой метод записи: 'byte [] bytes = html.getBytes (charset); FileOutputStream output = new FileOutputStream (имя_файла); IOUtils.write (байты, вывод); output.close(); } ' – Robert

+0

Я проверил его и получил правильный результат из вашего метода чтения! – Seelenvirtuose

+0

Вы правы, это работает. Это была проблема IDE, что мой выходной файл не был скопирован в целевой каталог, а на пути к классу у меня был старый файл. – Robert

0

Сначала убедитесь, что компилятор и редактор используют одну и ту же кодировку. Это можно проверить попробовав (некрасиво) \uXXXX вытекание:

während 
w\u00E4hrend 

Тогда

"<meta http-equiv='Content-Type' content='text/html; charset=" 
    + charset.name() + "' />" + 

    byte[] bytes = html.getBytes(charset); 
    Files.write(Paths.get(fileName), bytes); 

Ааа, убедитесь, что файл находится в Windows-1252 тоже. Редактор программиста, такой как NotePad ++ или JEdit, позволяет играть с кодировками.