Кодировка Freemarker - знаки вопроса вместо символов с диакритическими знаками

Я пытаюсь напечатать символы с диакритическими знаками с помощью Freemarker, но вместо символов с диакритическими знаками я получаю только вопросительные знаки. Я проверил, что верно следующее утверждение:

 "UTF-8" == Environment.getCurrentEnvironment().getConfiguration().getDefaultEncoding()

Я легко вижу, что символы с диакритическими знаками правильно хранятся в переменной, прежде чем передать ее шаблону.

Мой контекст freemarker можно найти здесь: https://gist.github.com/1975239

Например, вместо:

 Jedinečný živý koncert, kde nejen, že uslyšíte, ale i uvidíte splynutí metalové kapely s padesátičlenným orchestrem včetně.

Я продолжаю получать:

 Jedine?ný ?ivý koncert, kde nejen, ?e usly?íte, ale i uvidíte splynutí metalové kapely s padesáti?lenným orchestrem v?etn?.

Спасибо.


person Vojtěch    schedule 04.03.2012    source источник


Ответы (5)


FreeMarker всегда обрабатывает текст как UNICODE, поэтому вопросительные знаки не генерируются. Поскольку буквы с акцентом не исходят из шаблонов (если я хорошо это понимаю), это должно быть неправильное кодирование вывода. См. также: http://freemarker.org/docs/app_faq.html#faq_questionmark

Кстати, getDefaultEncoding() не играет в этом никакой роли. Это влияет на декодирование, используемое при загрузке шаблонов, но вы говорите, что символы с акцентом не поступают из файла шаблона, также я не думаю, что вы можете получить ?-s из декодирования (если только для недопустимого UTF-8 последовательности байтов). Что касается кодирования вывода, FreeMarker просто использует Writer (в отличие от OutputStream), поэтому он не может на это повлиять.

person ddekany    schedule 05.03.2012
comment
Спасибо, теперь это имеет больше смысла, однако я не создаю экземпляр OutputStream, я полагаю, что он создается Spring. При отладке я вижу, что он использует org.apache.catalina.connector.CoyoteWriter, но я не могу найти ссылку на его кодировку. Спасибо - person Vojtěch; 05.03.2012
comment
Кодировка, используемая Catalina, безусловно, зависит от свойства characterEncoding файла HttpServletResponse. Так что, если у вас есть что-то вроде response.setContentType("text/html; charset=UTF-8"); в вашем контроллере MVC, это может решить эту проблему. Но, возможно, это неправильный способ установки кодировки в Spring. - person ddekany; 07.03.2012
comment
Хорошо спасибо! Использование HttpServletResponse.setCharacterEncoding() помогло! - person Vojtěch; 07.03.2012

Мне удалось решить аналогичную проблему с нестандартными символами (например, ™), установив тип содержимого в FreeMarkerViewResolver:

<bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
...
    <property name="contentType" value="text/html;charset=UTF-8"/>
...
</bean>
person Stano    schedule 20.03.2012

Для пользователей DROPWIZARD: сработало прохождение кодировки UTF-8 в конструкторе:

import io.dropwizard.views.View;

import java.nio.charset.Charset;

public class SomeView extends View {
    public SomeView() {
        super("/views/some.ftl", Charset.forName("UTF-8"));
    }
}
person AndacAydin    schedule 15.07.2015

Для сервлета freemarker существуют параметры инициализации для кодирования шаблона и вывода. Вы можете сравнить его со своей конфигурацией.

person Joop Eggen    schedule 05.03.2012

В проекте Dropwizard это можно исправить, добавив <#ftl encoding="utf-8"> в начало файла шаблона, как описано в Часто задаваемые вопросы FreeMarkers. Это работает, потому что Dropwizard использует кодировку шаблона для вывода.

person Martin    schedule 26.03.2021