2012-03-04 3 views
4

Я пытаюсь напечатать акцентированные персонажи с 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?. 

Спасибо.

ответ

1

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

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

+0

Спасибо, теперь имеет смысл, но я не создаю экземпляр OutputStream, я полагаю, он создан Spring. При отладке я вижу, что он использует org.apache.catalina.connector.CoyoteWriter, но я не могу найти ссылку на его кодировку. Спасибо –

+1

Кодировка, используемая Каталиной, безусловно, зависит от свойства characterEncoding от 'HttpServletResponse'. Поэтому, если у вас есть что-то вроде 'response.setContentType (« text/html; charset = UTF-8 »),' в вашем MVC-контроллере, который может его решить. Но, возможно, это не правильный способ настройки кодировки весной. – ddekany

+0

Хорошо, спасибо! Использование HttpServletResponse.setCharacterEncoding() сделал трюк! –

0

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

6

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

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

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

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")); 
    } 
} 
Смежные вопросы