服务器响应和浏览器请求产生乱码问题详述

 在解决乱码问题之前要先了解编码集的概念

 编码集:

     1、作用:让数字与字符产生映射关系

     2、不同的编码集能映射的字符也不同

     3、不同的编码集中相同的字符可能对应的数字也不一样

 代码演示产生乱码的原因
    public class Demo1 {
	   public static void main(String[] args) throws IOException {
		String str = "中";
		// 字符 转换成字节
		byte[] b1 = str.getBytes("UTF-8");
		byte[] b2 = str.getBytes("GBK");
		
		System.out.println(Arrays.toString(b1));// 结果是[-28, -72, -83]
		System.out.println(Arrays.toString(b2));// 结果是[-42,-48]
		// 用UTF-8编码表将字节转换成字符
		byte[] b3 = new byte[] { -28, -72, -83 };
		String str2 = new String(b3, "UTF-8");
		
		System.out.println(str2);// 结果是:中
		// 用GBK编码表将字节转换成字符
		String str3 = new String(b3, "GBK");
		System.out.println(str3);// 结果是:涓?
      
		//场景1:编码集不一样,比如IO操作(在根目录下创建一个编码模式是UFT-8的文本文件 存放:“中”)
	        InputStream in=new FileInputStream("test.txt");
	        byte[] buffer=new byte[1024];
	        int length=in.read(buffer);
	        String str4 = new String(buffer,0,length,"UTF-8");
	        System.out.println(str4);
	        /*场景2:编码集不一样,但是没有乱码
	            比如默认GBK的eclipse向默认UTF-8的mysql中写入中文数据,不会产生乱码
	            因为Mysql自己做了处理:
	             Eclipse(GBK): "中" ------ [-42,-48] 
	             Mysql:1、将字节按照GBK编码表转换成字符new String([-42,-48],"GBK") ----"中"
	                   2、将"中"按照UTF-8 解析成字节[-28, -72, -83];
	                   3、存储解析后的字节
           */
        }
     } 

    总结:由于操作字符时,编码不统一造成乱码现象

1、服务器响应时出现乱码问题,

            Eclipse采用的是UTF-8的编码,TomCat服务器默认的是ISO-8859-1编码,浏览器默认的是GBK编码,如下图所示:

           注意: 以字符为标准传输数据时,会产生数据丢失,数据丢失就会编码失败,进而乱码

   
   解决方式   
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
		//设置服务器编码集
                response.setCharacterEncoding("UTF-8");
                //设置浏览器编码集              
               response.setHeader("content-type","text/html;charset=UTF-8");
		response.getWriter().print("你好!");//浏览器界面输出中文:你好!
	}
    注意:
       response调用setHeader时,默认调用了setCharacterEncoding方法,所以在程序中,可以省略设置服务器编
    码集的方法。




2、服务器请求时出现乱码问题



         //告诉Tomcat不要使用默认的ISO-8859-1 而是使用UTF-8
         //Post方式解决乱码
	    request.setCharacterEncoding("UTF-8");
            String word = request.getParameter("word");
            System.out.println("word");   //控制台打印“中” 
	 //get方式解决乱码   
	    byte[] bytes = request.getParameter("word").getBytes("ISO-8859-1");
	    String str=new String(bytes,"UTF-8");
            System.out.println(str);  //控制台打印“中”



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

洪洞小猿在路上

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值