我正在尝试用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?.
感谢。
答案 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。