以下总结这段时间以来遇到的中文问题汇集:
注:以下“后台”字眼,相当于在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后加入以下内容:
set character encoding
operator.setcharacterencodingfilter
encoding
utf-8
set character encoding
/*
***********************************************************************
3.下载时,“另保存为”默认名字显示乱码
原因:不清楚。。。
在tomcat安装目录的config/sever.xml内的
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片段
stringconverter
util.stringconverter
3、在页面使用转换器
jsf估计是天生就是这个毛病,凡是有jsf标签生成的html代码中有中文的(指从 backbean中提取出来的),在html源代码中回出现类似:雨滴 这种“汉字内码”,比如jsf的代码如下:
哈哈
呵呵
浏览器显示如下:
雨滴雨滴2
哈哈
呵呵
而查看html源代码如下:
雨滴雨滴2
<br>
哈哈
<br>呵呵
我们发现用jsf标签出来的有内码,而不是jsf标签的就没事。(网页服务器编码等都是utf-8统一的)。
那么有什么办法呢?
第一个方法,写一个自定义的converter,在jsf中有这种功能,但是我测试了写了一个converter,但是效果令我失望,因为我发现jsf的内在逻辑把汉字变成内码的地方在converter以后,我在converter中添加什么东西,在html源代码中还是内码。于是放弃
第二种方法是在写个servlet的filter过滤器,放到web.xml中,但是由于汉字内码雨需要去掉前后坠,然后把这几个数字变成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
紫蝶∏飛揚↗ 阅读(4354)
评论(2) 所属分类:
jsf 、
重点 、
数据转换