随笔-9  评论-168  文章-266  trackbacks-0

以下总结这段时间以来遇到的中文问题汇集:

注:以下“后台”字眼,相当于在servlet内,或者某一个类内,或者struts的action内。

1.一字符串在后台用system.out.println输出正常,保存在session里到JSP页面显示乱码

最初的乱码问题.

原因:似乎是默认的JSP页面采用8859-1编码,显示不了中文。

解决:在JSP页面上方加个<%@ page contentType="text/html;charset=utf-8"%>解决。当然,也可以用charaset="gbk","gb2312"之类的编码,不过建议还是用utf-8,详细原因去看看jdon板桥里人的那篇《中文乱码终极解决方法》。

 *****************************************************************************

2.提交表单,在后台读取表单内容发现乱码

原因:request的默认编码问题,具体不甚清楚,没看过tomcat源代码。。。

解决:写个fileter,具体如下:

package operator;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class SetCharacterEncodingFilter implements Filter {
 protected String encoding = null;

 protected FilterConfig filterConfig = null;

 public void init(FilterConfig filterConfig) throws ServletException {
  this.filterConfig = filterConfig;
  this.encoding = filterConfig.getInitParameter("encoding");
 }

 public void doFilter(ServletRequest request, ServletResponse response,
   FilterChain chain) throws IOException, ServletException {

  request.setCharacterEncoding("UTF-8");
  chain.doFilter(request, response);
 }

 public void destroy() {

  this.encoding = null;
  this.filterConfig = null;
 }

 protected String selectEncoding(ServletRequest request) {
  return (this.encoding);
 }
}

web.xml配置:

在servlet-mapping后加入以下内容:

 <filter>
  <filter-name>Set Character Encoding</filter-name>
  <filter-class>operator.SetCharacterEncodingFilter</filter-class>
   <init-param>
   <param-name>encoding</param-name>
   <param-value>UTF-8</param-value>
  </init-param>
 </filter>

 <filter-mapping>
  <filter-name>Set Character Encoding</filter-name>
  <url-pattern>/*</url-pattern>
 </filter-mapping>
***********************************************************************

3.下载时,“另保存为”默认名字显示乱码

原因:不清楚。。。

在tomcat安装目录的config/sever.xml内的

    <Connector
port="80"               maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="UTF-8" />

加进最后的“URIEncoding="UTF8"

4.在后台用system.out.println()输出正常,保存到mysql数据库EMS显示乱码,读回数据也是乱码

原因:mysql默认采用的是latin1编码;

解决:创建表的时候要修改成utf-8。如果已存在表,用EMS的话,直接修改table-property里面的default charater set就可以了,其他管理工具不知道,没用过。

5.在后台用system.out.println()输出正常,保存到mysql数据库EMS显示乱码,读回数据时——居然正常了,直接往数据库里插入正常的中文,读出——居然乱码了;

原因:EMS管理工具的默认显示问题

解决:register数据库时,client default  charater set改utf-8

注:这该死的问题困扰了我好长一段时间,一直以为我程序有问题,检查了N久,发现居然是工具显示问题。。

6.COMMON-UPLOAD 上传中文名文件时,显示乱码

原因:common-upload组件默认采用系统的编码,而页面传过来的请求采用UTF-8编码。

我的系统是简体中文WINDOWS 2K3,系统编码是GBK,当页面请求过来时,UPLOAD就把UTF8编码的流直接按GBK编码了。。。如果用new String(oldStr.getBytes("gbk"),"utf8)可以发现,部分中文可以还原回去。

解决:网上的说法五花八门,甚至有归罪于这是UPLOAD的BUG,其实只要在

 DiskFileUpload fu = new DiskFileUpload();

后加一句:

fu.setHeaderEncoding("utf8");

就解决了。。。

看来有时候还是直接读英文帮助手册来得正确。。。




问题描述:
在inputtext中输入中文,然后在输出,显示为乱码。

解决方法:
1、自定义转器
package util;
import java.util.Map;
import javax.faces.component.UIComponent;
import javax.faces.convert.Converter;
import javax.faces.context.FacesContext;
import javax.faces.convert.ConverterException;

public class StringConverter implements Converter {
 public Object getAsObject(FacesContext context, UIComponent component,
   String newValues) throws ConverterException {
  String newstr = "";
  if (newValues == null) {
   newValues = "";
  }
  byte[] byte1 = null;
  try {
   byte1 = newValues.getBytes("ISO-8859-1");
   newstr = new String(byte1, "GB2312");
   UIInput input=(UIInput)component;//
   input.setSubmittedValue(newstr);
  } catch (UnsupportedEncodingException e) {
   e.printStackTrace();
  }

  return newstr;

 }

 public String getAsString(FacesContext context, UIComponent component,
   Object Values) throws ConverterException { 
  return (String) Values;
 }
}

2、注册转换器
faces-config.xml片段
<converter>
  <converter-id>stringconverter</converter-id>
  <converter-class>util.StringConverter</converter-class>
</converter>

3、在页面使用转换器
<h:inputText id="account" value="#{util.account}" required="true" styleClass="input" > 
 <f:converter converterId="stringconverter"/>                                                                       <!--注:这里不是EL表达式-->

</h:inputText>





      JSF估计是天生就是这个毛病,凡是有jsf标签生成的html代码中有中文的(指从 backbean中提取出来的),在html源代码中回出现类似:&#38632;&#28404; 这种“汉字内码”,比如jsf的代码如下:
<f:view>
   <h:outputText value="#{testBean.testValue}"></h:outputText>
   <br>
   哈哈
</f:view>
<br>呵呵

浏览器显示如下:
雨滴雨滴2
哈哈
呵呵

而查看html源代码如下:

&#38632;&#28404;&#38632;&#28404;2
<br>
哈哈
<br>呵呵

我们发现用jsf标签出来的有内码,而不是jsf标签的就没事。(网页服务器编码等都是UTF-8统一的)。

那么有什么办法呢?

第一个方法,写一个自定义的Converter,在jsf中有这种功能,但是我测试了写了一个converter,但是效果令我失望,因为我发现jsf的内在逻辑把汉字变成内码的地方在converter以后,我在converter中添加什么东西,在html源代码中还是内码。于是放弃

第二种方法是在写个Servlet的Filter过滤器,放到web.xml中,但是由于汉字内码&#38632;需要去掉前后坠,然后把这几个数字变成char,在变成String。每个字都用这种方法变回来,这样本身效率回很低,而且一个html文档中用jsf显示的内容占有比率有多有少,如果没有标签的也是用这个过滤器一个字一个字取解析,那么效率就更不敢恭维了。虽然这种方法一定可行(因为过滤器可以到输出的最后一步),但是由于效率问题,我没有取试。

第三种方法是我自己研究出来的,通过FacesContext类来作,方法如下:
首先,写一个类
public class Converter {
public static void process(String str){
   FacesContext fc=FacesContext.getCurrentInstance();
   try {
    fc.getResponseWriter().write(str);
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
}
}

然后在每个backbean中需要getXXX方法中返回是String的方法中修改如下:
      把 return XXX   改为   return ""
      在return前面,也就是方法的最后一步,添加Converter.process(testValue),这个testValue是你要return的变量
ok,就这么简单^_^。。。

在网上找了一天没找到合理解决方法,用这个方法终于解决了。。

posted on 2008-05-21 09:50 紫蝶∏飛揚↗ 阅读(4501) 评论(2)  编辑  收藏 所属分类: JSF重点数据转换

评论:
# re: [转]JSF中文输入乱码问题解决方法[未登录] 2015-03-02 20:34 | kkk
赞一个  回复  更多评论
  
# re: [转]JSF中文输入乱码问题解决方法 2016-06-08 15:38 | 啊速度发
个体gay特权 让我去听听 天庆 4安琪儿 我去而他却让他 企鹅问题探讨去 去问问情人 如图切尔奇请问天然气热天气额  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: