Путаница с кодировкой FreeMarker

Когда я читаю шаблон в кодировке UTF-8 с помощью FreeMarker, специальные символы отображаются в браузере правильно, хотя freeMarkerConfig.getDefaultEncoding() возвращает «Cp1252». Если я ставлю freeMarkerConfig.setDefaultEncoding("UTF-8"), я вижу в браузере только вопросительные знаки, хотя "UTF-8" - это реальная кодировка файла шаблона. В каждом случае отправляется HTTP-заголовок «Content-Type: text/html; charset=UTF-8».

Есть идеи, что не так?


person deamon    schedule 08.08.2010    source источник


Ответы (4)


Установите свойство типа контента в FreeMarkerViewResolver.

Пример Spring 4.2

@Bean
public FreeMarkerViewResolver freemarkerViewResolver() {
    FreeMarkerViewResolver resolver = new FreeMarkerViewResolver();
    resolver.setContentType("text/html; charset=utf-8");
    resolver.setCache(true);
    resolver.setPrefix("");
    resolver.setSuffix(".ftl.html");
    resolver.setRequestContextAttribute("rc");
    return resolver;
}
person Daniel De León    schedule 29.03.2016

В случае, если вы используете структуру Spring и MimeMessage для отправки электронной почты, попробуйте настроить контент через MimeMessagePreparator следующим образом (я пропускаю метод getMessagePreparator mimemessagepreparator, так как важно, как установить контент):

// Create the message helper from the received mimemessage on the preparator
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
// ... include the from, to, subject, freemarker html generation here... text is the String variable with generated html
// Set the content as follows instead of helper.setText(text, true);
helper.getMimeMessage().setContent(text, "text/html;charset=utf-8");

Это сработало для меня, и браузеры правильно отображают символы при отправке электронных писем.

Подразумеваемые классы:

import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.mail.javamail.MimeMessagePreparator;
import javax.mail.internet.MimeMessage;

Также убедитесь, что ваша рабочая область имеет кодировку UTF-8 по умолчанию для файлов шаблонов, щелкнув правой кнопкой мыши их свойства, если вы используете eclipse IDE.

Надеюсь это поможет.

person Francisco Valle    schedule 27.09.2016
comment
2 года спустя, текущая версия, и у меня та же проблема. Я не использую весну. Я просто генерирую вывод с помощью freemarker. Установка кодировки шаблона на utf-8, кодировка по умолчанию на utf-8, кодировка вывода на utf-8 не помогает. Есть идеи? - person Christian13467; 12.10.2018
comment
Вы проверили кодировку файла шаблона? Я имею в виду, если вы откроете шаблон в текстовом редакторе, таком как notepad++, и установите кодировку utf-8, вы увидите правильные символы? Если нет, проблема связана с кодировкой, используемой при создании шаблона. - person Francisco Valle; 13.10.2018
comment
Кодировка шаблона utf-8. Все настройки (кодировка шаблона, кодировка вывода) тоже utf-8. Но результат обработки всегда находится в кодировке, заданной параметром -Dfile.encoding=xxx, то есть Cp1252 по умолчанию в системе Windows. Мое приложение работает в wildfly 10. Я использую freemarker 2.3.28. Может быть это будет интересно. - person Christian13467; 13.10.2018
comment
Я нашел свою ошибку. Я использовал OutputStreamWriter, чтобы обернуть входящий OutputStream, не устанавливая кодировку для выходной кодировки freemarker. Кодировка по умолчанию — Cp1252 или что-то другое, что я установил с помощью -Dfile.encoding. Нет проблем с freemarker!! - person Christian13467; 15.10.2018
comment
Даже если это не связано с проблемой, описанной в этом посте, рекомендуется избегать подобных ошибок, чтобы принудительно использовать utf-8 в качестве кодировки файла по умолчанию в вашей среде IDE, чтобы вы могли убедиться, что файл закодирован неправильно. - person Francisco Valle; 22.06.2020

Выходная кодировка соответствует кодировке вашего Java-оборудования. Если вы создадите выходной файл с UTF-FOO и передадите этот выходной файл в генерацию freemarker, выходная кодировка будет UTF-FOO.

См. проблемы с кодировкой.

С экс. код :

  Template templévénmts;
  BufferedWriter writ;
  OutputStreamWriter encodé;

  encodé = new OutputStreamWriter(
   new FileOutputStream(new File(f_dirDestination, résultat)), "UTF-8");
  writ = new BufferedWriter(
   encodé);
  templévénmts = f_freemarker.getTemplate(modèle);
  templévénmts.process(f_rootDatas, writ);
  writ.close();

Вы также можете использовать FileWriterWithEncoding в commons io.

person Istao    schedule 08.08.2010
comment
setDefaultEncoding относится к кодированию ввода. freemarker.org/docs/api/ freemarker/template/ Входные данные имеют кодировку UTF-8, и я сообщаю FreeMarker, что это будет кодировка UTF-8, но это работает только тогда, когда для чтения ввода используется кодировка Cp1252. - person deamon; 09.08.2010
comment
Какая у вас версия freemarker и в каком контексте вы ее используете? - person Istao; 09.08.2010
comment
Я использую FreeMarker 2.3.16 вместе с JAX-RS (реализация: Джерси) и, наконец, с сервлетами. - person deamon; 09.08.2010
comment
Если вы установите все способы ввода в UTF-8 и обработаете свой шаблон в файл в вашей локальной системе с настройками UTF-8, будет ли результирующий файл в порядке? - person Istao; 09.08.2010
comment
Я сделал это. Я установил весь вывод и кодировку по умолчанию на utf-8. Я прочитал шаблон с utf-8. Я обработал вывод как utf-8. Записал результат на диск и получил cp1252 (в системе Windows). Когда я установил -Dfile.encoding=utf-8, все было в порядке. Где берется file.encoding в реализации freemarker? - person Christian13467; 12.10.2018

Ну, это определенно похоже на то, что независимо от того, что вы думаете, что ваш ввод закодирован в UTF-8, на самом деле он действительно закодирован в Cp1252. Можешь перепроверить, т.е. hex-редактором. Я поддерживаю мнение Истао — попробуйте преобразовать файл шаблона в локальный файл и проверьте результаты.

person Attila Szegedi    schedule 09.08.2010
comment
Я проверил кодировку с помощью jEdit, который очень хорошо обрабатывает кодировки. Любопытно то, что он работает даже с одними и теми же файлами шаблонов в системе с кодировкой UTF-8 по умолчанию. Поэтому FreeMarker должен использовать UTF-8 для чтения входных файлов. - person deamon; 09.08.2010