Freemarker编码 - 带有重音字符的问号

时间:2012-03-04 23:00:18

标签: java 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?.

感谢。

5 个答案:

答案 0 :(得分:7)

我可以通过在FreeMarkerViewResolver上设置内容类型来解决与非标准符号(如™)类似的问题:

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

答案 1 :(得分:7)

对于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"));
    }
}

答案 2 :(得分:2)

FreeMarker始终将文本视为UNICODE,因此不会生成问号。由于重音字母不是来自模板(如果我理解的话),它必须是你的输出编码是不合适的。另见:http://freemarker.org/docs/app_faq.html#faq_questionmark

BTW,getDefaultEncoding()在这方面没有任何作用。这会影响加载模板时使用的解码,但是你说重音字符不是来自模板文件,我也认为你不能从解码中获得? - s(除非,因为无效的UTF-8字节序列)。从输出的编码开始,FreeMarker只使用Writer(而不是OutputStream),因此不会影响它。

答案 3 :(得分:0)

对于freemarker servlet,存在用于编码模板和输出的init参数。您可以将其与配置进行比较。

答案 4 :(得分:0)

在 Dropwizard 项目中,这可以通过在模板文件的开头添加 <#ftl encoding="utf-8"> 来解决,如 FreeMarkers’s FAQ 中所述。这是因为 Dropwizard uses the encoding of the template for the output