Freemarker在读取ftl文件时转换HTML ISO标记

时间:2015-01-28 06:20:05

标签: java freemarker

我正在尝试在Freemarker中生成的HTML文件中输出引号。模板文件包含:

Kevin’s

生成HTML文件时,它显示为:

Kevin?s

起初我认为问题发生在HTML文件的生成过程中。但我能够跟踪转换到读取模板的时间。有人知道如何在阅读模板时阻止Freemarker进行此转换吗?我的转换代码:

// Freemarker configuration object
Configuration cfg = new Configuration(new Version(2, 3, 21));
try
{
  cfg.setDirectoryForTemplateLoading(new File("templates"));
  cfg.setDefaultEncoding("UTF-8");
  cfg.setTemplateExceptionHandler(TemplateExceptionHandler.HTML_DEBUG_HANDLER);

  // Load template from source folder
  Template template = cfg.getTemplate("curly.html");
  template.setEncoding("UTF-8");

  // Build the data-model
  Map<String, Object> data = new HashMap<String, Object>();

  // Console output
  Writer out = new OutputStreamWriter(System.out);
  template.process(data, out);
  out.flush();
}
catch (IOException e)
{
  e.printStackTrace();
}
catch (TemplateException e)
{
  e.printStackTrace();
}

1 个答案:

答案 0 :(得分:1)

如果模板文件确实包含Kevin&#8217;s,那么out也是Kevin&#8217;s(因为FreeMarker不解析HTML实体),所以我想你的意思是那个带有该代码的字符在那里作为一个角色。在这种情况下,最可能的罪魁祸首与FreeMarker无关:new OutputStreamWriter(System.out)。您已经省略了构造函数的编码参数,因此它将使用系统默认编码。即使您确实指定了,您的控制台也有固定的编码(不一定是系统默认的BTW)。因此,尝试通过为OutputStreamWriter显式指定UTF-8将输出写入文件。如果输出仍然是错误的,那么检查您是否确实使用UTF-8创建模板文件,以及读取输出文件。

顺便说一下,template.setEncoding没有必要。删除它。