Freemarker 编码 - 用问号代替重音字符

Posted

技术标签:

【中文标题】Freemarker 编码 - 用问号代替重音字符【英文标题】:Freemarker encoding - question marks in the place of accented characters 【发布时间】:2012-03-22 12:17:44 【问题描述】:

我正在尝试使用 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?.

谢谢。

【问题讨论】:

【参考方案1】:

对于 DROPWIZARD 用户:通过构造函数中的 UTF-8 字符集得出:

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】:

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

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

【讨论】:

【参考方案3】:

FreeMarker 始终将文本视为 UNICODE,因此它不会生成问号。由于重音字母不是来自模板(如果我理解得很好),那一定是您的输出编码不正确。另见:http://freemarker.org/docs/app_faq.html#faq_questionmark

顺便说一句,getDefaultEncoding() 在这方面没有任何作用。这会影响加载模板时使用的解码,但是您是说重音字符不是来自模板文件,而且我认为您不能从解码中获得 ?-s (除非,对于无效的 UTF -8 字节序列)。至于输出的编码,FreeMarker 只使用Writer(而不是OutputStream),所以它不会影响它。

【讨论】:

谢谢,现在更有意义了,但是我没有创建 OutputStream 实例,我想它是由 Spring 创建的。调试时,我可以看到它使用 org.apache.catalina.connector.CoyoteWriter,但我找不到任何关于使用它进行编码的参考。谢谢 Catalina 使用的字符集肯定取决于HttpServletResponse 的“characterEncoding”属性。因此,如果您的 MVC 控制器中有 response.setContentType("text/html; charset=UTF-8"); 之类的东西,那可能会解决它。但是,这可能不是在 Spring 中设置编码的正确方法。 好的,谢谢!使用 HttpServletResponse.setCharacterEncoding() 成功了!【参考方案4】:

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

【讨论】:

【参考方案5】:

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

【讨论】:

以上是关于Freemarker 编码 - 用问号代替重音字符的主要内容,如果未能解决你的问题,请参考以下文章

带有重音符号的 XML 字符编码问题

如何在没有百分比编码的情况下在 Swift URL 中包含重音字符?

$User?.name中问号有啥意义

js三种编码格式

使用 .NET 如何将包含 Latin-1 重音字符的 ISO 8859-1 编码文本文件转换为 UTF-8

带有 php 和重音字符以及 ENT_XML1 的 XML 的 UTF-8 编码