以下总结这段时间以来遇到的中文问题汇集:
注:以下“后台”字眼,相当于在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源代码中回出现类似:雨滴 这种“汉字内码”,比如jsf的代码如下:
<f:view>
<h:outputText value="#{testBean.testValue}"></h:outputText>
<br>
哈哈
</f:view>
<br>呵呵
浏览器显示如下:
雨滴雨滴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
紫蝶∏飛揚↗ 阅读(4501)
评论(2) 编辑 收藏 所属分类:
JSF 、
重点 、
数据转换