Web开发中文乱码及解决方案

来源:互联网 发布:javascript编程精粹 编辑:程序博客网 时间:2024/05/20 02:26
在搞Web开发过程中,难免会遇到中文乱码问题,常识:
     所谓乱码就是由于编码和解码所用的字符集不同而引起的解析错误。
  a,java语言在内存当中以unicode编码格式(字符集)来保存一个字符。
  b,编码:将unicode编码格式对应的字节数组转换成
  某种本地编码格式(gbk,utf-8,gb2312)对应的字节数组。
  c,解码:将某种本地编码格式对应的字节数组转换成
  unicode编码格式对应的字节数组。
servlet中:编码相关的问题及解决方式
 (1)servlet如何输出中文?
  a,乱码问题产生的原因
     默认情况下,out.println会使用"iso-8859-1"来进行编码。
  b,解决方式
      response.setContentType("text/html;charset=utf-8");
  当然,编码格式只要支持中文即可,比如,还可以设置为 gbk。
  这行代码的作用有两个:
  作用1:生成一个消息头(content-type),告诉浏览器,服务器返回的数
                据类型(MIME)和编码格式
  作用2:也设置了out.println在输出时使用的编码格式。
                注意:这句代码必须放在PrintWriter out=requst.getWriter()之前
 (2)表单有中文参数,如何处理?
  a,乱码问题产生的原因
    当表单提交时,浏览器会对表单中的中文使用
  浏览器打开表单所在的页面时的编码格式进行编码。
  b,解决方式:
   方式一:
        step1,要保证表单所在的页面按照指定的编码格式打开。需要在<head>中添加标签
  <meta http-equiv="content-type" content="text/html;charset=utf-8">
        step2,让服务器按照指定的编码格式进行解码。
                request.setCharacterEncoding("utf-8");
                注意:这句代码必须要放在getParameter方法之前执行
                然而,以上方式只对post请求有效。对于get请求则需要另寻他方
  方式二:
    step1,同上。
    step2,
  String name = new String(name.getBytes("iso-8859-1"),"utf-8");
以下是一个实例:
   public class HelloServlet extends HttpServlet{
 public void service(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException{
  
  //必须要放在getParameter方法之前执行。
  request.setCharacterEncoding("utf-8");
  //1.读取请求参数 
   //getParameter方法用来依据请求的参数名(“name”) 获得参数值
  String name=request.getParameter("name");
//  name=new String(name.getBytes("iso-8859-1"),"utf-8");
//对post和get都有效 麻烦,一般使用上面的方法 表单的提交一般是post
  System.out.println(name);
  String age=request.getParameter("age");
  String[] city=request.getParameterValues("city");
  //2.处理请求数据
  int age1=Integer.parseInt(age)+1;
  String msg="<h1>你好 "+name+"你的年龄是"+age1+"</h1>";
//  String msg="<h1>hello"+name+"</h1>";8
//  3.输出处理结果
  //生成一个消息头(content-type),告诉浏览器,服务器返回的数据类型和编码方式,
                // 此外out.println时使用此编码方式编码
  response.setContentType("text/html;charset=utf-8");
  PrintWriter out=response.getWriter();
       //将处理结果缓存到response对象上
  out.print(msg);
  for(int i=0;i<city.length;i++){
   out.println("<h2>"+city[i]+"</h2>");
  }
  out.close();
 }
}
Ajax中乱码问题:
                     1)发送get请求
   a,产生乱码问题的原因
    ie浏览器对应的ajax对象对中文参数值会使用
   gbk进行编码,而其它浏览器会使用utf-8进行编码。
    web服务器默认情况下,会使用iso-8859-1进行
   解码。
   b,解决方式
    step1,使用encodeURI函数对请求地址进行编码。
            该函数会对其中的中文参数值按照utf-8进行编码。
    step2,让服务器统一使用utf-8进行解码。
   比如,可以修改tomcat的配置文件。
    conf/server.xml
    对<Connector>添加URIEncoding="utf-8"。
   tomcat会对所有的get请求中的参数使用utf-8进行解码。
     2)发送post请求
   a,产生乱码问题的原因
       所有浏览器对应的ajax对象对中文参数都
   使用utf-8进行编码。服务器使用iso-8859-1
   进行解码。
   b,解决方式,只许一步在服务器端
      request.setCharacterEncoding("utf-8"); 
以上是网页上的乱码问题,正所谓上梁不正下梁歪,如果你通过网页得到的源数据就是乱码的,那么肯定在网页上也是乱码的。
所以要保证数据库里面的数据是正常支持中文的。
   将中文数据插入数据库要注意两点:
  1)数据库要支持中文,即数据库要设置正确的字符集(比如,gbk,utf-8)
  create database mydb
  default character set utf8;
  2)jdbc驱动要能够进行正确的编码和解码:
  jdbc驱动在插入中文数据时,要做编码处理;
  在查询中文数据时,要做解码处理。
  mysql的jdbc驱动的某些版本,不能够正确地
  进行编码和解码,必须要加上两个参数:
   jdbc:mysql://localhost:3306/jsd1308db?useUnicode=true&characterEncoding=utf8
此外,如果你不借助工具直接在终端进行数据的插入和修改,则也可能插入的数据出现乱码,原因是终端不能对中文进行解析。
0 0
原创粉丝点击