GET请求乱码根源及解决

浏览器会自动对url进行编码,不同浏览器用的编码集不同,可进行设置。

  • tomcat默认是用iso-8859-1对uri和get参数进行解码
  • 所以如果这个过来的get参数用的是utf-8编码的,
  • 到了服务器端tomcat用iso8859-1解码就会出现乱码。

下列模拟请求后 服务端获取请求数据的 代码片段

private static void service(Socket socket) throws Exception {
		//读取 HTTP 请求信息
		InputStream socketIn = socket.getInputStream();
		Thread.sleep(500); //当前线程休眠500毫秒
		
		//返回从该输入流中可以读取(或跳过)的字节数的估计值,
		//而不会被下一次调用此输入流的方法阻塞
		int size = socketIn.available();
		
		byte[] requestBuffer = new byte[size];
		socketIn.read(requestBuffer); //输入流, 将读取到的字节存储到 字节数组中
		String request = new String(requestBuffer,"iso-8859-1"); //request请求 
	}

参考上列代码:

  • 数据是以二进制 流 的形式传输的
  • 获得输入流 InputStream socketIn = socket.getInputStream();
  • 读取流中的数据 socketIn.read(requestBuffer);存到字节数组中
  • String request = new String(requestBuffer,"iso-8859-1");
    构造一个新的Striing 根据 “iso-8859-1” 做解码操作

上面代码足以说明了乱码的前因后果 :
  1. 请求的get参数是用utf-8编码
  2. tomcat默认是用iso-8859-1对uri和get参数进行解码
    相当于
    String request = new String(requestBuffer,"iso-8859-1")
    这段代码,以iso-8859-1解码操作。此时直接输出会发现乱码。
  3. 根源:编码(utf-8),解码(iso-8859-1),不 统 一

解决方案

  1. 修改tomcat配置的解决方法:
    修改配置文件server.xml <conntect URIEncoding="UTF-8"/>,用utf-8对uri解码。
  2. byte[ ] encode = "乱码字符”.getbytes("iso-8859-1");
    将乱码的字符以 iso-8859-1 重新编码回去。
    此时得到原始数据—(单纯以utf-8编码后的数据)
    String decode = new String(encode,“utf-8”);
    以utf-8进行解码操作。此时的到的数据就是编码之前的数据
    编码(utf-8),解码(uft-8), 统 一 乱码问题解决!

编码:能看懂的字符——>二进制
例:byte[ ] encode = "喜”.getbytes(“utf-8”);


解码:二进制——>能看懂的字符
例:String decode = new String(encode,“utf-8”)


总结:出现乱码的根本原因就是 编码方式和解码方式不统一 !

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值