编码解码小结

最近工作遇到了汉字编码解码问题,认真测试了下,现在做下笔记:

一、URLEncoder.encode编码(将汉字按指定的码表转换为编码)和URLDecoder.decode(将编码按指定的码表解码为汉字)

		String nickName = "编码解码";
		String e = URLEncoder.encode(nickName, "UTF-8");
		System.out.println(e);
		String d = URLDecoder.decode(e, "UTF-8");
		System.out.println(d);
输出结果:

%E7%BC%96%E7%A0%81%E8%A7%A3%E7%A0%81
编码解码

二、开始解码错最后还能正常解码的情况

		String str = "你好";
		byte[] b= str.getBytes("utf-8");//使用utf-8编码
		String str2 = new String(b,"iso-8859-1");//使用iso-8859-1解错码		
		System.out.println(str2); 
		byte[] b2 = str2.getBytes("iso-8859-1");//使用iso-8859-1再编码一次
		String str3 = new String(b2,"utf-8");//使用utf-8正确的解码
		System.out.println(str3); 
输出结果:

??????
你好

三、开始解码错最后不能正常解码的情况

		String str = "你好";
		byte[] b= str.getBytes();//默认是getBytes("gbk")编码
		String str2 = new String(b,"utf-8");//使用"utf-8"解码解出乱码
		System.out.println(str2); 
		byte[] b2 = str2.getBytes("utf-8");//使用"utf-8"进行编码
		String str3 = new String(b2,"gbk");//使用gbk进行解码-》解出来的还是乱码
		System.out.println(str3); 
输出结果:

???
锟斤拷锟?

四、实例开发中常见的编码解码问题

1、在java web开发中,经常用到tomcat服务器,tomcat是会将接收到的数据默认以ISO-8859-1解码的,所以如果在程序中还是直接以URLDecoder.decode来解码会解不出来

                String nickName = "编码解码";
		nickName = URLEncoder.encode(nickName, "UTF-8");
		System.out.println(nickName);		
		nickName = URLDecoder.decode(nickName, "iso-8859-1");//模拟tomcat以ISO-8859-1解码数据
		System.out.println(nickName);		
		nickName= URLDecoder.decode(nickName,"UTF-8");
		System.out.println(nickName);
输出结果:

%E7%BC%96%E7%A0%81%E8%A7%A3%E7%A0%81
??????�???
??????�???

上面的问题要解决可以这样做,先将tomcat解码错的数据再进行一次iso-8859-1编码,然后再以正确的码表utf-8进行解码

		String nickName = "编码解码";
		nickName = URLEncoder.encode(nickName, "UTF-8");
		System.out.println(nickName);		
		nickName = URLDecoder.decode(nickName, "iso-8859-1");
		System.out.println(nickName);		
		System.out.println(new String(nickName.getBytes("iso-8859-1"), "UTF-8"));
输出结果:
%E7%BC%96%E7%A0%81%E8%A7%A3%E7%A0%81
??????�???
编码解码

说明:nickName.getBytes("iso-8859-1")是重新编码,new String(nickName.getBytes("iso-8859-1"), "UTF-8")是重新解码

2、上面的情况是指没有经过浏览器发请求的,假设项目是用了浏览器向服务器端发送请求,由于浏览器是会按指定的编码自动将汉字编码的,所以省略了编码步骤,tomcat服务器接到请求后,自动以ISO8859-1解码,会出现乱码???? ,所以这时要把乱码重新用ISO8859-1编码一次,然后在用utf-8进行解码,就得到浏览器发送过来的文字了。

该方法是开发中经常用到的乱码解决方法:

String name1 =new String(request.getParameter("name").getBytes("iso-8859-1"),"utf-8");

注意:request.getParameter("name")获取的是????,所以要重新编码解码一次


总结:URLEncoder.encode等价于new String(),即是URLEncoder.encode编码一次,用new String()解码一次所取得的结果等价。

如以下例子,判断汉字编码后跟tomcat服务器端接收到后解析后在进行编码出来的结果是否想过

客户端:URLEncoder.encode(“编码解码”, "UTF-8");

服务器端:URLEncoder.encode(new String(request.getParameter("name").getBytes("iso-8859-1"), "UTF-8"), "UTF-8")

request.getParameter("name") = "服务器端经tomcat自动解码后的错误的字符串"

1、request.getParameter("name").getBytes("iso-8859-1")  是重新编码

2、new String(request.getParameter("name").getBytes("iso-8859-1"), "UTF-8") 这就解码得到汉字“编码解码”了

3、URLEncoder.encode(new String(request.getParameter("name").getBytes("iso-8859-1"), "UTF-8"), "UTF-8")等价于URLEncoder.encode(“编码解码”, "UTF-8")




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值