Шаблоны Velocity, похоже, не работают с UTF-8

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

Sübjäct $item

Все работает нормально, кроме перевода двух символов Юникода. Строка результата, напечатанная в командной строке, выглядит так:

Sübjäct foo

Я искал на веб-сайте скорости и в Интернете эту проблему и придумал различные варианты кодирования шрифтов, которые я добавил в свой код. Но это не помогает. Это фактический код:

velocity.setProperty("file.resource.loader.path", absPath);
velocity.setProperty("input.encoding", "UTF-8");
velocity.setProperty("output.encoding", "UTF-8");

Template t = velocity.getTemplate("subject.vm");
t.setEncoding("UTF-8");

StringWriter sw = new StringWriter();

t.merge(null, sw);       
System.out.println(sw.getBuffer());

Как решить эту проблему?


person steve    schedule 01.03.2011    source источник


Ответы (4)


Вы пробовали использовать этот синтаксис?

Template template = Velocity.getTemplate("subject.vm", "UTF-8");

Похоже, это должно работать правильно.

person Jon Skeet    schedule 01.03.2011
comment
Привет, большое спасибо. Что касается другого комментария, скорость на самом деле является экземпляром VelocityEngine. Но фрагмент кода в любом случае является тестовым, имена собственные существуют только в рабочем коде;) - person steve; 01.03.2011
comment
@Stony: Ну, ОП, кажется, думает, что это сработало для них, так что похоже, что у вас, вероятно, есть проблемы где-то еще. Я предлагаю вам задать новую проблему с минимально воспроизводимым примером, показывающим, что вы пробовали и что пошло не так. - person Jon Skeet; 03.09.2016
comment
Извините, наконец-то я понял причину. Ваше решение работает. Причина, по которой моя программа не работает, заключается в том, что я использовал ve.setProperty(eventhandler.referenceinsertion.class, org.apache.velocity.app.event.implement.EscapeXmlReference); и EscapeXmlReference нарушил кодировку. - person Stony; 05.09.2016
comment
@goblingift: Ну, не особенно, если перегрузка с одним параметром использует кодировку платформы по умолчанию, что имеет место во многих API Java. (Я не знаю, так ли это, но это кажется разумным предположением...) - person Jon Skeet; 10.06.2017

Если вы используете VelocityEngine вместе с классом JavaMailSenderImpl, не забудьте установить свойство defaultEncoding. Кроме того, как упоминалось выше, попробуйте настроить свойства input.encoding и output.encoding для класса VelocityEngine. Я оставляю пример ниже.

Конфигурационный файл

<bean id="smtpSession" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName" value="java:jboss/example/jndiName"/>
    </bean>
<bean id="javaMailSenderImpl" class="org.springframework.mail.javamail.JavaMailSenderImpl">
        <property name="session" ref="smtpSession"/>
        <property name="defaultEncoding" value="UTF-8"/>
</bean>

<bean id="velocityEngine" class="org.springframework.ui.velocity.VelocityEngineFactoryBean">
        <property name="velocityProperties">
            <props>
                <prop key="input.encoding">UTF-8</prop>
                <prop key="output.encoding">UTF-8</prop>
                <prop key="response.encoding">UTF-8</prop>
                <prop key="resource.loader">file</prop>
                <prop key="file.resource.loader.class">org.apache.velocity.runtime.resource.loader.FileResourceLoader
                </prop>
                <prop key="file.resource.loader.path">${relative.path}/email-templates</prop>
                <prop key="file.resource.loader.cache">false</prop>                    
            </props>
        </property>
    </bean>
person darkconeja    schedule 22.07.2016

Мое решение: добавьте "-Dfile.encoding=UTF-8" в параметр jvm (кавычки не включены).

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

После нескольких дней поиска и изучения, я предполагаю, что моя проблема возникла при рендеринге html-файла velocitie, потому что я обнаружил, что некоторый неправильно отображаемый текст на самом деле находится в кодировке GB2312, я понял, что кодировка файла vm неверна, когда страница была рендеринг (наверное).

person user5465377    schedule 22.09.2016
comment
Это сработало отлично. Должен ли это быть случай, чтобы открыть вопрос о механизме шаблонов скорости? Параметр должен был вызвать желаемое кодирование. - person wdavilaneto; 08.10.2019
comment
Хотя это будет работать, оно изменяет множество значений по умолчанию для многих вещей во всей JVM, что может быть не тем, что вам нужно. Остерегайтесь изменять значение по умолчанию, когда доступны более целевые параметры. - person Christopher Schultz; 06.02.2020

Если вы создаете экземпляр JavaMailSenderImpl вручную, вы можете установить свойство кодирования следующим образом:

JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
Properties mailProperties = new Properties();
mailProperties.put("defaultEncoding", "UTF-8");
mailSender.setJavaMailProperties(mailProperties);

Если вы используете MimeMessageHelper, установите кодировку следующим образом:

MimeMessageHelper helper = new MimeMessageHelper(mailSender.createMimeMessage(), true, "UTF-8");

Наконец, для Velocity Engine есть два способа получить/применить шаблон при установке кодировки:

Template template = Velocity.getTemplate("template", "UTF-8");
// or
velocityEngine.mergeTemplate("template", "UTF-8", velocityContext, stringWriter);
person Toribio    schedule 21.05.2020