编码有关问题-JavaWeb
编码:
编码:字符串变为字节;解码:字节变为字符串
服务器:一般是ISO8859-1编码[response.getWriter().print(“大家好”);服务器将“大家好”这个字符串编码为计算机能读取的字节码,采用的时ISO8859-1编码]
浏览器:一般是gbk解码[浏览器收到服务器的响应后将服务器编码的字节码解码为字符串显示在浏览器上。]
1. 请求编码
客户端发送的数据编码:由浏览器来决定:
1). 如果是在地址栏中直接给出url,那么一般都是默认为GBK,但这个可能不太大。
2). 如果是通过页面上的表单或超链接发出请求,那么由当前页面的编码来决定发送的参数的编码。
无论浏览器发送过来的是什么编码的数据,Tomcat都默认使用ISO-8859-1来编码
1). POST:可以使用request.setCharacterEncoding()方法来设置请求体数据的编码,因为POST请求参数在请求体中,所以是可以设置编码的。在使用request.getParameter()方法获取参数之前,先使用request.setCharacterEncoding()方法来设置编码即可。
2). GET:没有方法可以设置它,因为参数在url中。所以使用request.getParameter()获取到的数据一定是错误的使用了iso-8859-1解码的。可以再使用iso-8859-1把字符串转回到byte[],再重新使用正确的编码来解码即可。
String s = request.getParameter("s");//使用iso-8859-1错误的解码了
byte[] bytes = s.getBytes("iso-8859-1");//退回错误的编码,让字符串通过iso-8859-1返回到字节数据,即还原字节数据
s = new String(bytes, "utf-8");//重新使用正确的utf-8来解码。
响应乱码解决:
response.setCharacterEnconding(“utf-8”):设置服务器响应给浏览器的数据是以utf-8编码的。而不能通知浏览器以什么样的编码来解析响应的数据。
response.setHeader(“Content-Type”,”text/html;charset=utf-8”): content-Type它的作用是通知浏览器响应数据的mimeType类型,并通知浏览器响应数据的编码以及以什么样的编码来解析数据;
response.setContentType(“text/html;charset=utf-8”);【这两句作用相同】
Request:
请求乱码解决:
在浏览器输入数据时,浏览器会对输入的数据进行编码(utf-8)。
Request对象是由服务器创建的,服务器将浏览器传递的参数封装到request对象时会对浏览器编码的数据进行解码(iso8859-1)后然后再封装到request对象中。
请求参数乱码解决:
1)、先将浏览器编码的数据用服务器码表进行重新编码,然后再用服务器与浏览器对应的码表进行解码【因为tomcat8以下的都是默认的iso8859-1码解码的】。
String name = reuqest.getParameter(name);
Name = new String(name.getBytes(“iso8859-1”,”utf-8”));
2)、简洁写法:只对post请求有效
request.setCharacterEncoding(“utf-8”);
关于get/post请求参数格式:
Get请求的参数是在请求行中资源路径后:
/webContext/xxx?time=new Date()&password=11;
Post:请求参数是在请求正文中
userName=tom&password=111;
cookie中不允许有中文,如果要保存中文,需要用URL编码:
保存cookie:
String name = URLEncoder.encode("姓名", "UTF-8");
String value = URLEncoder.encode("张三", "UTF-8");
获取cookie:
String name = URLDecoder.decode(c.getName(), "UTF-8");
String value = URLDecoder.decode(c.getValue(), "UTF-8");