J2EE-JavaWeb项目的编码乱码问题

时间:2021-07-27 13:03:51
在每次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");
  • POST表单乱码:request.setCharacterEncoding("utf-8");设置
  • JDBC驱动在连接时也可以指定编码字符集:
    • Mysql:url="jdbc:mysql://localhost:3306/DB?useUnicode=true & characterEncoding=GBK"

根据上面的分析,希望你可以找到你的乱码问题,到底出现在哪个编码环节!重点在于根据不同的情况,选择不同的字符集,最好是统一整个项目的字符集,这样你会轻松很多