在每次web项目中,不多不少得遇到了一些编码问题,如果你是一个有准备的人,在前期工作中就将一切编码调整完毕,也许你也会忽视这些问题。
- 编码为什么存在?
世界存在各种各样的语言,我们可以看懂自己的语言,但是机器要直接辨别这些语言是不可能的。计算机把人类语言(字符)一个一个存储于计算机的基本存储单元(字节)中,一个字节为8个bit,所以最多能表示的字符是256个,此时,采用编解码的思想,把char型的字符,按照一套固定的规范,转换成byte字节,那么机器中就可以存储不止256个人类语言了。
常见的编码有:
- ASCII码:128个;
- ISO-8859-1:对于ASCII的扩展,涵盖很多西欧语言字符,单字节编码
- GB2312:双字节中文编码集,基本涵盖汉字;
- GBK:对于GB2312的扩展,与GB2312兼容;
- UTF-8/16:Unicode统一码,也是使用最多的编码,不论什么字符都可以用两个字节表示,简化高效,由ISO创建,试图翻译所有世界上的语言
WEB项目中常见的编码设置含义
pageEncoding="GBK"
通知JSP编译器,将jsp文件转换为java文件的编码,也就是jsp文件自身的编码
charset="UTF-8"
设置服务器响应时重新编码(字节到字符)使用的编码集,即服务器发送给客户端内容的编码
request.setCharacterEncoding("gb2312");
设置接收请求内容使用的编码集
response.setContentType("text/xml");
.setCharacterEncoding("gb2312");
在Http响应头中发送,设置浏览器的编码集,注意ContentType有多种设置方式,此处不一一列举。
这两天在Ajax传值时发生了乱码问题,文件内容如下:
$.ajax({
type:'post',
url:'http://localhost:8080/FormUpload/UnitCodeCheckServlet',
data:'unitcode='+str,
success:function(data){
if(data!=""){
alert(data);
}
else{
alert("未找到匹配的信息")
}
},
error:function(data){
alert("服务器繁忙!");
}
});
ajax向后台校验一个值是否匹配,此处为js文件中
response.setContentType("text/html;charset=gb2312");//正常
// response.setCharacterEncoding("gb2312");使用此句依旧乱码
String unitcode = request.getParameter("unitcode");
PrintWriter pw = response.getWriter();
String result="";
System.out.println("收到的数据为:"+unitcode);
if(unitcode.equals("123")){
result="妇幼保健院";
}
pw.write(result);
这是一个在我实在不想使用json的时候写的一个交互,传给后台只有1个字符串,后台传回来的也只有一个字符串,当只设置响应编码集时,依然乱码,设置了响应的ContentType时,正常。所以在ajax使用response的PrintWriter传值时,因为这个类与这种输出方法的问题,要记得设置MIME类型给浏览器,否则也会乱码。
response.setContentType("text/html; charset=utf-8"); html
.setContentType("text/plain; charset=utf-8"); 文本
text/javascript json数据
application/xml xml数据
各种默认编码
- tomcat :默认使用编码集GBK(版本)
- Windows下的资源文件,如Word,Excel默认使用GB2312编码
- URL参数获取:
- 在tomcat下,使用方法
request.getParameter("")
获取通过URL传递的参数时,默认使用的编码是ISO-8859-1;如果你正好在这里遇见了乱码,可以使用下列两种解决办法:-
request.setCharacterEncoding("utf-8");
在调用上述方法之前设置编码集; - 手动对获取到的字符串进行重新编码;
String id = request.getParameter("id");
id = new String(id.getBytes("ISO-8859-1"),"UTF-8");
-
- 在tomcat下,使用方法
- POST表单乱码:
request.setCharacterEncoding("utf-8");
设置 - JDBC驱动在连接时也可以指定编码字符集:
Mysql:url="jdbc:mysql://localhost:3306/DB?useUnicode=true & characterEncoding=GBK"