① 首选先认识一下编码的格式
GB2312简体中文 utf-8国际编码 iso-8859-1美国用的编码(tomcat中传输用的编码)
GBK是 GB2312的扩展都是简体中文
② 接着我们举例子1 来说明乱码的问题
1 页面 formpost.jsp 是提交数据的页面
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ page contentType="text/html;charset=iso8859-1"%>
<html>
<head>
<title>中文问题</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<form action="formsave.jsp" method="post" name="form">
<input type="text" name="test" value="测试" />
</form>
</body>
</html>
第一个地方的编码格式为jsp文件的存储格式。Eclipse会根据这个编码格式保存文件。并编译jsp文件,包括里面 的汉字。dreamweaver 是在在首选参数中设置
第二处编码为解码格式。因为存为UTF-8的文件被解码为iso8859-1,这样如有中文肯定出乱码。也就是必须一 致。而第二处所在的这一行,可以没有。缺省也是使用iso8859-1的编码格式。所以如果没有这一行的话,“我是个好人”也会出现乱码。必须一致才可以。
第三处编码为控制浏览器的解码方式。如果前面的解码都一致并且无误的话,这个编码格式没有关系。有的网页出 现乱码,就是因为浏览器不能确定使用哪种编码格式。因为页面有时候会嵌入页面,导致浏览器混淆了编码格式。出现了乱码。
2 页面 formsave.jsp
<%@ page contentType="text/html; charset=utf-8" language="java" import="java.sql.*" errorPage="" %>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>测试数据</title>
</head>
<body>
<%
String test=request.getParameter("test");
out.print(test);
%>
</body>
</html>
结果发现是乱码这是因为 tomcat 取得数据以后转为iso8859-1发送给formsave.jsp引起的
过程formpost.jsp (utf-8)--------->>> tomcat(数据iso8859-1)-------------->>>>formsave.jsp(utf-8)
所以要在formpost.jsp 加入 test=new String(test.getBytes("ISO8859_1"),"utf-8");
这样做要在每个页面加入这个代码很麻烦 所以最好在每个页面加载前使用过滤器
(过滤器 在web.xml中注册)
但是如果提交的页面是采用get或者js写路径的方式提交过滤器不起作用
这是解决方法
Get走的是url提交,而在进入url之前已经进行了iso8859-1的编码处理。要想影响这个编码则需要在server.xml的Connector节点增加useBodyEncodingForURI="true"
属性配置,即可控制tomcat对get方式的汉字编码方式,上面这个属性控制get提交也是用request.setCharacterEncoding ("UTF-8")所设置的编码格式进行编码。所以自动编码为utf-8,接受页面正常接受就可以了。但我认为真正的编码过程是,tomcat又要根据
<Connector port="8080"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000" useBodyEncodingForURI="true"
disableUploadTimeout="true" URIEncoding=”UTF-8”/>
(tomcat6.0的时候似乎最后面的URIEncoding=”UTF-8”不能加,或者不用加,不加测试通过)
里面所设置的URIEncoding=”UTF-8”再进行一次编码,但是由于已经编码为utf-8,再编码也不会有变化了。如果是从url获取编码,接受页面则是根据URIEncoding=”UTF-8”来进行解码的
③ 上传乱码的问题
上传文件时,form表单设置的都是enctype="multipart/form-data"。这种方式以流方式提交文件。如果使用apach的上传组件,会发现有很多乱码想象上传文件时,form表单设置的都是enctype="multipart/form-data"。这种方式以流方式提交文件。如果使用apach的上传组件,会发现有很多乱码想象 我使用的是 xiaoxiang 上传组建 在全部为gb的环境下使用没有问题 只是在utf-8时会乱码
④PreparedStatement添加数据的时候要将 new String(str.getBytes("gbk"),"ISO8859-1"); 转为iso8859-1
⑤ ajax 乱码
加上设置字符编码的方法:
response.setHeader("charset","gb2312"); 看到的说明原文如下: 用AJAX中采用get来读取页面时,responseText里面的中文多半会出现乱码,这是因为xmlhttp在处理返回的responseText的时候,resposeBody默认采用utf-8编码,如果服务器送出的确实是utf-8的数据流的时候汉字会正确显示,而读取的页面编码是GBK或者GB2312时就会出现页面中文的乱码。 1、在送出的流里面加一个header,指明送出的是具体编码流: PHP:header('Content-Type:text/html;charset=GB2312'); 2、采用utf-8编码来保存HTML文档 |