Проблема с кодировкой символа валюты шаблона Freemarker - PullRequest
0 голосов
/ 06 мая 2020

Использование шаблона freemarker с java приводит к неверному символу валюты. Ожидая $, но получаю ¤

Я безуспешно пытался установить 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}

1 Ответ

1 голос
/ 08 мая 2020

Это не проблема кодировки. Символ ¤ называется знаком валюты, а числовой формат Java печатает его, если фактическая валюта неизвестна. Причина, по которой он этого не знает, заключается в том, что вы устанавливаете для параметра FreeMarker locale значение locale.getLanguage() (например, «en») вместо locale.toString() (например, «en_US», которое также содержит страну), а язык недостаточно для выбора валюты, это решает страна.

Кроме того, если вы можете, избегайте setSetting и вызывайте строго типизированные методы, такие как freemarkerConfig.setLocale(locale), freemarkerConfig.setTimeZone(timeZone) и т. д. 1011 *.

...