Freemarker模板货币符号编码问题
Freemarker template currency symbol encoding issue
将 freemarker 模板与 java 一起使用会生成错误的货币符号。
期待 $
但得到 ¤
我试过在 freemarkerConfig 上设置 encoding
和 outputEncoding
但没有成功
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)
等
将 freemarker 模板与 java 一起使用会生成错误的货币符号。
期待 $
但得到 ¤
我试过在 freemarkerConfig 上设置 encoding
和 outputEncoding
但没有成功
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)
等