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 项目中,可以通过在模板文件的开头添加<#ftl encoding="utf-8">
来解决此问题,如FreeMarkers’s FAQ 中所述。这是因为Dropwizard uses the encoding of the template for the output。
【讨论】:
以上是关于Freemarker 编码 - 用问号代替重音字符的主要内容,如果未能解决你的问题,请参考以下文章
如何在没有百分比编码的情况下在 Swift URL 中包含重音字符?