中⽂乱码在java中de⽅法要调⽤两次解决⼀、场景:
1、我在客户端要通过get⽅式调⽤服务器端的url,将中⽂参数做utf-8编码,需要在js中两次的进⾏编码,服务器端才能⽤decode⽅法⼀次获取。
例如:
var xing=encodeURIComponent(encodeURIComponent(xing));
2、如果我在客户端⽤java输出汉字作为参数,并且⽤http协议,也是需要两次才能在服务器端正常的⼀次decode
de(xing,"UTF-8");
de(xing,"UTF-8");
服务器端只需要⼀次decode xing=URLDecoder.decode(xing, "UTF-8");
⼆、原理:
因为在jsp中对中⽂进⾏了编码的时候⽤的是UTF-8的编码⽅式,⽽在servlet中调⽤Paramete
r();⽅法的时候使⽤服务器指定的编码格式⾃动解码⼀次,所以前台编码⼀次后台解码⼀次⽽解码和编码的⽅式不⽤所以造成了乱码的出现,
这就类似于以下代码:
String name
=
de(
"
测试
"
,
"
UTF-8
"
);
System.out.println(name);
System.out.println(java.URLDecoder.decode(name,url编码和utf8区别
"
ISO-8859-1
"
));
编码后的是%E6%B5%8B%E8%AF%95。。
⽽⽤ISO-8859-1解码后的是è?。。
但是如果调⽤的是
System.out.println(java.URLDecoder.decode(name,
"
UTF-8
"
));
则结果是打印“测试”。
这就印证了之前为什么我在servlet中调⽤java.URLDecoder.Parameter("name"), "UTF-8")⽅法和调⽤
java.URLDecoder.QueryString(), "UTF-8")所得到的结果是不⼀样的,就是由于在Parameter("name")之前会⾃动做⼀次解码的⼯作,⽽且是默认的ISO-8859-1。
所以,在使⽤java.URLEncoder.decode()和java.URLDecoder.decode(),的时候需要在前端页⾯中使⽤两次
java.URLDecoder.decode()⽅法。
使⽤两次编码的过程相当于如下代码:
String name
=
de(
"
测试
"
,
"
UTF-8
"
);
System.out.println(name);
name
=
de(name,
"
UTF-8
"
);
System.out.println(name);
name
=
java.URLDecoder.decode(name,
"
UTF-8
"
);
System.out.println(name);
System.out.println(java.URLDecoder.decode(name,
"
UTF-8
"
));
输出为:
%E6%B5%8B%E8%AF%95
%25E6%25B5%258B%25E8%25AF%2595
%E6%B5%8B%E8%AF%95
测试
第⼀次编码后将汉字编码为%和字母数字的格式,⽽第⼆次编码的时候是对%字母数字进⾏编码,虽然解码的时候使⽤的是ISO-8859-1,但是对于%和字母数字⽽⾔⽤ISO-8859-1和UTF-8解码出来的是⼀样的,此时就回到了汉字被编码过⼀次的字符串了,当再次进⾏解码的时候使⽤UTF-8就回将它转会汉字。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论