Search code examples
javaencodingjettyfreemarker

Freemarker encoding wrong


I have project it's jetty server which use freemarker. I use russian letters in my templates and receive ?. All subjects i have read before didn't help me. I use in my code

.setContentType("text/html;charset=utf-8");
.setCharacterEncoding("UTF-8");

all my files is utf-8.

My Freemarker page genertor servlet

public class PageGenerator {

    private static PageGenerator pageGenerator;
    private Configuration cfg;

    public static PageGenerator instance() {
        if (pageGenerator == null)
            pageGenerator = new PageGenerator();
        return pageGenerator;
    }

    public String getPage(String filename, Map<String, Object> data) {
        Writer stream = new StringWriter();
        try {
            Template template = cfg.getTemplate(filename);
            template.process(data, stream);
        } catch (IOException | TemplateException e) {
            e.printStackTrace();
        }
        return stream.toString();
    }

    private PageGenerator() {
        cfg = setCfg();
     }

    private Configuration setCfg(){
        cfg = new Configuration(Configuration.VERSION_2_3_20);
        try {
            cfg.setDirectoryForTemplateLoading(new File("templates/"));
            cfg.setDefaultEncoding("UTF-8");
            cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return cfg;
    }
}

But in brouser my page in windows-1252 encoding.


Solution

  • Thanks for idea ddekany I used debag mode and find out that Class Response that extends HttpServletResponse has "magic" method .setCharacterEncoding() which set Character Encoding in response stream