public class UrlTest {
public static void main(String[] args) throws Exception {
String s = "中文"; //1. 这里是GBK编码
String s1 = URLEncoder.encode(s, "iso8859-1"); //2. 这里再用iso8859-1编码了一回
System.out.println(s1);
byte[] b = s1.getBytes("iso8859-1"); //3. 这里又用iso8859-1编码了一回, 这回编成了字节数组
String s3 = new String(b,"utf-8"); //4. 这里用utf-8解码.
System.out.println(s3);
System.out.println(s1.equals(s3)); //这里的打印结果怎么可以为true呢. 怎么能一样呢?
}
}
/*
说明 : 一个中文字符串(就是中文二字), 先用iso8859-1编码(编码后还是字符串, 见第2步), 再用iso8859-1编码(编码后为字节数组)
最后用utf-8解码成字符串, 怎么变成和第一次打印的结果相同呢? 太费解了吧. 上边那也没用到utf-8啊. 应该解码后是乱七八糟
的字符啊, 最后打印结果怎么为true呢?
*/
[quote]String s = "中文"; //1. 这里是GBK编码
String s1 = URLEncoder.encode(s, "iso8859-1"); //2. 这里再用iso8859-1编码了一回[/quote]
这一步出来的s1,已经是乱码了。
后面再转一次是用乱码字符串在转,这里面都是数字和英文,而且用的都是string的转码方式,都不会出问题,所以都是相同的。
[code="java"]
String s = "中文";
String s1 = URLEncoder.encode(s, "iso8859-1");
System.out.println(s1);
String s3 = URLDecoder.decode(s1,"iso8859-1");
System.out.println(s3);
System.out.println(s1.equals(s3));
[/code]
这样你就能看出来了。根本已经变成乱码了。
[code="java"]
String s = "中文";
String s1 = URLEncoder.encode(s, "gbk");
System.out.println(s1);
String s3 = URLDecoder.decode(s1,"gbk");
System.out.println(s3);
System.out.println(s1.equals(s3));
[/code]
这样才是正常的。
虚拟机内部有固定编码方式(好像是utf-32),它会将你程序中的字符串转换成它自己的编码,你写的“中文”是jbk,他就用jbk方式去读,转换成utf-32,你又转换成iso-8859,它就给你转换成iso-8859,反正是你要什么格式它给你转成什么格式,只要没读错,就不会给你转换错。