乱码问题 ...... (附自己简单分析)但没有解决!求助
在这先谢谢各位了 。。。小弟真的是很疑惑!希望可以给予指点!谢谢
乱码问题 :
1.表单页面编码
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<META http-equiv=Content-Type content="text/html; charset=UTF-8">
2.ActionForm获取数据后,直接交给Action,没有进行编码的转换
3.Action中iso->utf-8,然后作为参数传给model层
4.由于数据库是iso,然后编码 utf-8->iso,存入数据库!
5.从数据库取出的时候,编码 iso->utf-8 ,request保存给显示页面
6.显示页面编码
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<META http-equiv=Content-Type content="text/html; charset=UTF-8">
结果:字符串显示乱码
自己"比较笨"的分析:
1.页面的 <%@ page language="java" contentType="text/html; charset=UTF-8"> 指定了表单输入内容的编码为utf-8
2.tomcat获取数据的时候,将获取的数据按照自己的iso重新编码(我从iso->utf-8转化,中文字符可正常显示)
3.看了网上的资料,说java在内部的字符串字符串用统一的Unicode编码,也就是utf-16,这样对我传递的字符串参数有影响吗?怎么影响的?
测试数据:
输入数据是 :我的测试
Action编码后,打印 : 我的测试
从数据库取出,iso->uft-8编码后,在控制台打印 :??????????
疑问:
1. utf-8对中文是 :一个中文三个字节编码的,但现在四个字只有10问号,说明字节丢失了,在那丢失的呢?
2.更加可恨的是,存入的数据库的时候,我 gbk->iso 编码,存入数据库,然后从数据库拿出来的时候,iso->gbk是正确的?但我根本没有utf-8到gbk 的一个过程!
3.我想直接不编码,我不是获取的数据不是iso的吗,我直接存进数据库,然后取出的时候 iso->utf-8,但也是乱码?
[解决办法]
这个问题lz可以自己慢慢查找的。
你现在一下子就问到结果方面,一时半会还真没人能完全解决的。
首先,确认你每一步的编码转换都是正确的。你可以把数据输出看看。
其次找到出现问题的那环,看看到底需要用什么编码。可以先不用转编码看看。
最后,如果实在还是不能解决,在发个贴出来看看。
在给参考:如果出现??????说明已经有两次编码转换错误,而如果只是显示乱码则说明其中有一次编码转换出错。
[解决办法]
web.xml里的配置
<filter>
<filter-name>Filter</filter-name>
<filter-class>
utils.info.EncodingFilter
</filter-class>
<init-param>
<param-name>Encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
过滤器类:
public class EncodingFilter implements Filter {
protected FilterConfig config;
protected String Encoding = null;
public void init(FilterConfig config) throws ServletException {
this.config = config;
this.Encoding = config.getInitParameter("Encoding");
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
if (request.getCharacterEncoding() == null) {
if (Encoding != null) {
request.setCharacterEncoding(Encoding);
response.setCharacterEncoding(Encoding);
}
}
chain.doFilter(request,response);
}
public void destroy() {}
}
这个过滤器可以解决大部分问题,
如果有多个过滤器要把这个放在最前面
[解决办法]
你这里没有提到你的数据库,但是听意思,应该是MYSQL这样的数据库。
如果是mysql的数据库,可以如下:
1、在mysql下建立数据库,如果不是mysql4.0.20及一下版本,那么建立好数据库以后,设置其编码为GBK。
2、进出库不需要转码,页面一律用GBK,然后<%@ page language="java" contentType="text/html; charset=gbk"%>
<META http-equiv=Content-Type content="text/html; charset=gbk">
3、按照以上操作,不会出现乱码。因为这个我们已经尝试过太多次了。
------解决方案--------------------