前提
1、tomcat版本:8.5.70
2、html的格式如下:GB2312编码、GET方式表单提交
html
<head>
<meta charset="GB2312">
<title>Title</title>
</head>
<body>
<form enctype="application/x-www-form-urlencoded" action="http://localhost:8080/Web_Test_for_Study_war_exploded/one" method="GET">
<input type="text" name="name" value="张三">
<input type="submit" value="submit">
</form>
Servlet处理
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String nameStr = req.getParameter("name");//name是html提交的“张三”;
//直接打印:
System.out.println(nameStr);//输出:"????"
//各自的字节数组及长度
byte[] bytesStrUTF = nameStr.getBytes("UTF-8");
byte[] bytesStrIso = nameStr.getBytes("iso-8859-1");
byte[] bytesStrGB2312 = nameStr.getBytes("GB2312");
System.out.println(bytesStrUTF.length);//输出:"12"
System.out.println(bytesStrIso.length);//输出:"4"
System.out.println(bytesStrGB2312.length);//输出:"4"
//各自的打印
System.out.println(new String(bytesStrUTF,"UTF-8"));//输出:"????"
System.out.println(new String(bytesStrIso,"iso-8859-1"));//输出:"????"
System.out.println(new String(bytesStrGB2312,"GB2312"));//输出:"????"
//两两组合打印
System.out.println(new String(bytesStrUTF,"GB2312"));//输出:"锟斤拷锟斤拷"
System.out.println(new String(bytesStrUTF,"iso-8859-1"));//输出:"????????????"
System.out.println(new String(bytesStrIso,"UTF-8"));//输出:"????"
System.out.println(new String(bytesStrIso,"GB2312"));//输出:"????"
System.out.println(new String(bytesStrGB2312,"UTF-8"));//输出:"????"
System.out.println(new String(bytesStrGB2312,"iso-8859-1"));//输出:"????"
}
自己的猜想
自己以为的是:html采用GB2312编码,其次经过URLEncoder编码,最后再通过iso编码发送出去。而服务器tomcat经过iso解码,得到URL编码,再解码得到原来的GB2312的字节流,但是tomcat8.5版本会采用UTF-8进一步解码并存储在内存中。所以我以为直接通过UTF-8得到原字节流,再使用GB2312解码即可,但事实上打脸了,所以玩了一下排列组合,关键还没组合出来。郁闷。多谢解答。