日期:2014-05-18  浏览次数:20641 次

乱码问题 ...... (附自己简单分析)但没有解决!求助
在这先谢谢各位了 。。。小弟真的是很疑惑!希望可以给予指点!谢谢 

乱码问题 : 

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="te