提交表单时指定编码

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);
	}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值