【问题标题】:Freemarker encoding - question marks in the place of accented charactersFreemarker 编码 - 用问号代替重音字符
【发布时间】: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?.

谢谢。

【问题讨论】:

    标签: java freemarker


    【解决方案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

          【讨论】:

            猜你喜欢
            • 2011-10-05
            • 2011-09-26
            • 1970-01-01
            • 2012-01-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-12-28
            • 1970-01-01
            相关资源
            最近更新 更多