Как заставить затмение распечатывать странные символы в юникоде? - PullRequest
7 голосов
/ 04 июня 2011

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

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

"meta http-equ =" 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();
        }
    }

и я немного запутался, почему это не работает. Вывод, который я получаю, - «Стрим», что очень странно.

Может кто-нибудь указать мне правильное направление? Спасибо!

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

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

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

Ответы [ 3 ]

19 голосов
/ 04 июня 2011

Установите Eclipse > Preferences > General > Workspace > Text file encoding в UTF-8.

4 голосов
/ 04 июня 2011

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

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

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

1 голос
/ 04 июня 2011

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

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

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


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 для получения поддержки новой строки.


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

...