在java中使用freemarker模板产生了一个错误的货币符号。期待 $
然而得到 ¤
我试过将 encoding
和 outputEncoding
在freemarkerConfig上没有任何进展
public String processTemplate(String freemarkerTemplate, Object model, Locale locale) throws IOException, TemplateException {
try {
this.freemarkerConfig.setSetting("locale", locale.getLanguage());
this.freemarkerConfig.setSetting("time_zone", "EST");
} catch (TemplateException e) {
log.warn("Failed to set locale {} for freemarker template.", locale.getLanguage(), e);
}
//freemarkerConfig.setEncoding(locale, "UTF-8");
//freemarkerConfig.setOutputEncoding("UTF-8");
Template template = freemarkerConfig.getTemplate(freemarkerTemplate);
//template.setOutputEncoding("UTF-8");
return FreeMarkerTemplateUtils.processTemplateIntoString(template, model);
}
也曾尝试过添加 <#ftl encoding="utf-8">
到我的模板文件,没有任何区别。
编辑
这是我使用货币函数的方法。 ${amountValue?string.currency}
这不是一个编码问题。∮字符被称为货币符号,如果Java数字格式不知道实际的货币,它就会打印出来。它不知道的原因是你将FreeMarker的 locale
设置为 locale.getLanguage()
(如 "en"),而不是 locale.toString()
(比如 "en_US",其中也包含国家),语言不足以决定货币,是国家决定的。
另外,如果可以的话,避免使用 setSetting
,并调用强类型的方法,如 freemarkerConfig.setLocale(locale)
, freemarkerConfig.setTimeZone(timeZone)
、等。