Reputation: 353
I have been trying to use a velocity Template with the following content:
Sübjäct $item
Everything works fine except the translation of the two Unicode characters. The result string printed on the command line looks like:
Sübjäct foo
I searched the velocity website and the web for this issue, and came up with different font encoding options, which I added to my code. But these don't help. This is the actual code:
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());
How an I fix this issue?
Upvotes: 25
Views: 29372
Reputation: 348
If you're using VelocityEngine along with JavaMailSenderImpl class, don't forget to set the defaultEncoding property. Also, as mentioned above, try configuring input.encoding and output.encoding properties for the VelocityEngine class. I leave an example below.
Configuration file
<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>
Upvotes: 2
Reputation: 4078
If you're creating a JavaMailSenderImpl
instance manually, you can set the encoding property this way:
JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
Properties mailProperties = new Properties();
mailProperties.put("defaultEncoding", "UTF-8");
mailSender.setJavaMailProperties(mailProperties);
If you're using MimeMessageHelper
, set the encoding as follows:
MimeMessageHelper helper = new MimeMessageHelper(mailSender.createMimeMessage(), true, "UTF-8");
Finally, for Velocity Engine, there are two ways to get/apply the template while setting the encoding:
Template template = Velocity.getTemplate("template", "UTF-8");
// or
velocityEngine.mergeTemplate("template", "UTF-8", velocityContext, stringWriter);
Upvotes: 0
Reputation: 1500525
Have you tried using this syntax?
Template template = Velocity.getTemplate("subject.vm", "UTF-8");
That looks like it should do the right thing.
Upvotes: 48
Reputation: 31
My solution: add "-Dfile.encoding=UTF-8" to jvm option(quotes not included).
I try the above possible solution, none of then works for me.
After days of twisted search and explore, I guess my problem happen on velocitie's rendering the html file, because I found some wrongly displayed text is actually in GB2312 encoding, I realised that the encoding of the vm file is not correct when the page is been rendering(I guess).
Upvotes: 1