Как сделать eclipse распечатать странные символы в unicode?

поэтому я пытаюсь заставить свою программу выводить текстовый файл со списком имен. Некоторые имена имеют странные символы, такие как Åström.

Я схватил этот список имен с веб-страницы, закодированной в "UTF-8", или, по крайней мере, я уверен, что это так, потому что источник страницы говорит

" meta http-equiv=" Content-Type "content=" text / html; charset=UTF-8"/"

Это то, что я пытался до сих пор:

public static void write(List<String> list) throws IOException  {
        Writer out = new OutputStreamWriter(new FileOutputStream("test.txt"), "UTF-8");
        try {
            for (int i=0;i<list.size();i++) {
                try {
                    byte[] utf8Bytes = list.get(i).getBytes("UTF-8");
                    out.write(new String(utf8Bytes, "UTF-8"));
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }

                out.write(System.getProperty("line.separator"));

            }
        }
        finally {
        out.close();
        }
    }

и я немного смущен, почему это не работает. Выход, который я получаю, - "à ... ström", что очень странно.

может кто-то пожалуйста, мне точку в правильном направлении? Спасибо!

и на другой несвязанной заметке, есть ли более простой способ написать новую строку в текстовый файл, кроме неуклюжего

выход.написать (система.метод getproperty("линии.разделитель"));

что у меня? Я видел это где-то в интернете, и это работает, но мне просто интересно, есть ли более чистый способ.

3 ответов


задание Eclipse > Preferences > General > Workspace > Text file encoding в UTF-8.


контент действительно находится в UTF-8, и он выглядит нормально, если напечатан на консоли. Что может быть причиной проблемы, это декодирование и кодирование строки, которая не нужна. Вместо OutputStreamWriter попробуйте использовать java.Ио.Печатник. У него есть println методы, которые распечатывают строку с разделителем системных строк в конце. Это будет выглядеть примерно так:

printStream.println(list.get(i));

кроме того, при открытии файла, чтобы увидеть его попробовать, используя браузер. Они позволяют выберите кодировку после ее открытия, чтобы вы могли быстро попробовать несколько кодировок, чтобы увидеть, что действительно используется.


Notepad не особенно многофункциональный редактор. Он попытается угадать кодировку документа, иногда с неожиданные результаты. Документы "обычного текста" не содержат метаданных об их кодировке, что дает им определенные ограничения. Приложения Windows (включая Блокнот) часто полагаются на byte-order-mark (U+FEFF или "\uFEFF" в строках Java), чтобы определить, является ли кодировка форматом Unicode. Это может помочь Блокноту; это будет бесполезно для ваша проблема с веб-страницей.

спецификация HTML 4 определяет как кодировка выхода должна быть установлена. Вы должны установить Content-Type HTTP-заголовок в дополнение к указанию мета-кодировки.

вы не упоминаете, что вы используете в своем веб-приложении. Сервлет должен установить тип содержимого setContentType("text/html; charset=UTF-8"); JSP должен использовать директиву page, чтобы сделать то же самое. Другие технологии view обеспечат аналогичные механизмы.


byte[] utf8Bytes = list.get(i).getBytes("UTF-8");
out.write(new String(utf8Bytes, "UTF-8"));

этот код выполняет некоторые бесполезные операции; он транскодирует символьные данные из UTF-16 в UTF-8, затем обратно из UTF-8 в UTF-16, затем записывает данные в Writer (который снова перекодирует UTF-16 в UTF-8). Этот код эквивалентен:

String str = list.get(i);
out.write(str);

использовать PrintWriter чтобы получить поддержку newline.


вы можете узнать больше о кодировке символов в Java здесь, здесь и здесь.