Freemarker中文出现乱码问题

 
 
 
Freemarker 中文出现乱码问题,首先考虑框架,如果用servlet,那就要做一下ftl文件的配置,首先在myeclipse里window - preferences - general - workspace,把text file encoding 设置成utf-8或者gbk,因为myeclipse默认都是ios-8859-1,所以这里一定要统一,选择什么编码,那所有文件都要设置,在调用模板类的的时候,代码可以如下:
 
Template template = new Configuration().getTemplate(themeName,"utf-8");
 
或者
 
Configuration CONFIGURATION = new Configuration();
CONFIGURATION.setDefaultEncoding("UTF-8"); 
 
这样应该就可以了,如果还是不行,可以尝试在web.xml里添加下面的配置。
 
  <servlet>
    <servlet-name>freemarker</servlet-name>
    <servlet-class>freemarker.ext.servlet.FreemarkerServlet</servlet-class>
    <!-- FreemarkerServlet 设置信息: -->
    <init-param>
      <param-name>TemplatePath</param-name>
      <param-value>/</param-value>
    </init-param>
    <init-param>
      <param-name>NoCache</param-name>
      <param-value>true</param-value>
    </init-param>
    <init-param>
      <param-name>ContentType</param-name>
      <param-value>text/html; charset=UTF-8</param-value>
      <!-- 输出时使用的编码格式 -->
    </init-param>
    <init-param>
      <param-name>template_update_delay</param-name>
      <param-value>0</param-value>
    </init-param>
    <init-param>
      <param-name>default_encoding</param-name>
      <param-value>utf-8</param-value>
      <!-- 设置ftl文件默认编码格式 -->
    </init-param>
    <init-param>
      <param-name>number_format</param-name>
      <param-value>0.##########</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>freemarker</servlet-name>
    <url-pattern>*.ftl</url-pattern>
  </servlet-mapping>
 
然后再说说struts,这个就比较扯了,因为我就是用的struts2 + spring + hibernate,所以在一开始出问题的时候我各种百度,结果发现没有多少有营养的。
其实struts出现乱码的的问题很常见,大家一般就再struts.xml里添加<constant name="struts.i18n.encoding" value="utf-8" />这个配置就OK了,可是如果在action类里调用模板类的话就算是给模板类设置setDefaultEncoding("UTF-8")这个编码值,输出也是有问题的。
关键来了。
大家都把目光放到Configuration类上得时候,其实都忽略了一点,就是struts里的HttpServletRequest和HttpServletResponse的编码,这哥俩很邪乎,因为输出模板的时候要用到PrintWriter这个类,而PrintWriter需要从Response中获得,所以如果不给HttpServletResponse设置编码的话,就算是你再怎么配置,也是白搭,于是乎,在action类中:
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
try {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
这样就不会有问题了。
因为这个的确容易被忽略,因为出问题的时候大多数人都会想尽一切办法配置freemarker或者ftl文件,而忽略了response,这也算是个非常规问题吧,在这里总结一下,跟大家共享。

你可能感兴趣的:(Freemarker中文出现乱码问题)