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