1,提交表单时可以指定编码吗?
准确地说:提交表单时可以指定请求要素的编码吗?
如果是使用html的form表单是不行的.
下面是我做的实验,html如下:
?
不仅head中指定了编码为gbk,而且form属性accept-charset 也指定为gbk,但是提交表单时,后台获取到的request charset却是"UTF-8",
?
chrome和火狐浏览器中都是一样.
结论:
(a)html的form表单标签中无法指定request的编码.
(b)提交的请求编码是UTF-8
?
那么表单标签中的属性accept-charset有什么作用呢?
告诉浏览器提交表单时以什么编码方式对请求要素进行编码
?
如上图,指定了accept-charset 的编码为:UTF-8,页面的编码是utf-8,而head中指定GBK编码,所以
address 的值乱码了,本来应该是"中国",结果显示:
?中国,两个汉字,以UTF-8编码则有6个字节,因为在html的header中指定了GBK编码,所以6个字节按照GBK解码,就是3个汉字,因此乱码.
提交post请求时,3个汉字会以accept-charset 指定的编码(UTF-8)来编码,所以是9个字节:
?
所以accept-charset 只是指定了提交时对请求要素如何编码,但是并没有指定请求的编码.
通俗点:只是默默地做了事,但是没有告诉服务器.
?
?
2,提交表单时为什么要指定请求编码?
解决乱码:
告诉服务器,请求要素的编码方式,这样服务器才知道应该如何解码.
?
3,方案
使用HttpURLConnection 可以指定编码
如何指定呢?
huc.addRequestProperty("content-type", contentType);
?contentType的值为:application/x-www-form-urlencoded;charset=GBK
?
4,服务器如何获取请求编码?
String charEncoding = request.getCharacterEncoding();
/*** * Get request query string, form method : post * * @param request * @return * @throws IOException */ public static String getRequestPostStr(HttpServletRequest request) throws IOException { byte buffer[] = getRequestPostBytes(request); if(ValueWidget.isNullOrEmpty(buffer)){ return null; } String charEncoding = request.getCharacterEncoding(); if (charEncoding == null) { charEncoding = "UTF-8"; } return new String(buffer, charEncoding); }
?
?
原文:http://hw1287789687.iteye.com/blog/2244924