Создайте файл UTF-8, используя HttpServletResponse - PullRequest
7 голосов
/ 20 февраля 2012

Я пытаюсь создать файл UTF-8 "myFile.aaa" с помощью HttpServletResponse (HttpServlet). Причина, по которой мне нужно, чтобы это был UTF-8, заключается в том, что он может содержать специальные непечатаемые символы.

Однако приведенный ниже код создает файл в кодировке ANSI. По крайней мере, это то, что говорит Notepad ++, и что я вижу, читая символы из этого файла. Что я делаю не так?

Спасибо

public void doPost(HttpServletRequest req, HttpServletResponse res)
    throws ServletException, IOException
    {
        res.setHeader("Content-Type", "application/octet-stream; charset=UTF-8");
        res.setHeader("Content-Disposition","attachment;filename=myFile.aaa");
        res.setCharacterEncoding("UTF-8");
        ServletOutputStream os = res.getOutputStream();
        os.print("Hello World");
        os.flush();
        os.close();
    }

Ответы [ 2 ]

11 голосов
/ 20 февраля 2012

Вам нужно использовать символьную запись ответа, а не поток вывода байтов.

Заменить

ServletOutputStream os = res.getOutputStream();
os.print("Hello World");
os.flush();
os.close();

от

res.getWriter().write("Some UTF-8");

Кроме того, я бы рекомендовал установить тип контента на text/plain, а не на слишком общий тип, который подразумевает двоичное содержимое, а не символьное содержимое.

Я не уверен насчет Notepad ++, но в Notepad, если текстовый документ не содержит символов вне диапазона ANSI, он будет интерпретироваться как ANSI. Не вводите вас в заблуждение этим поведением.

5 голосов
/ 18 сентября 2012

Вот мой образец:

private static final String KALIMAH = "\u0644\u064e\u0622 \u0625\u0650\u0644\u0670\u0647\u064e \u0625\u0650\u0644\u0651\u064e\u0627 \u0627\u0644\u0644\u0647\u064f \u0645\u064f\u062d\u064e\u0645\u0651\u064e\u062f\u064c \u0631\u0651\u064e\u0633\u064f\u0648\u0652\u0644\u064f \u0627\u0644\u0644\u0647\u0650";

protected void printGreeting (HttpServletResponse res) throws IOException {
    res.setContentType( "text/html" );
    res.setCharacterEncoding( "UTF-8" );
    PrintWriter out = res.getWriter();
    out.write( KALIMAH );
    out.close();
}
...