web项目中页面传参到后台,后台传参到页面的编码问题

来源:互联网 发布:51vv切换音频端口超时 编辑:程序博客网 时间:2024/06/01 09:35

我们总希望网络像本地一样的使用,输入什么就得到什么,但凡事总是事与愿违的多。在网络的世界里,我们要学的第一课就是编码。统一字符编码,是我们的理想,但首先要知道编码不统一的原因。十分遗憾的是,编码问题大部分是由于所使用的传输媒介和解析技术引起的,这正与我们理念中的与平台无关与浏览器技术无关的初衷相违背,我们甚至需要知道传输的一些细节才能得知编码的由来。

 

1.从页面传递到后台的参数
页面传参主要是指get方式的提交,post方式将会按照content="text/html; charset=GBK"指定的gbk来解析,也就是说不会产生乱码。
而get方式时参数会使用默认编码来提交,默认编码为iso-8859-1,也就是说后台需要以iso-8859-1格式来解析:
new String(request.getParameter("a").getByte("iso-8859-1"),"gbk");

解决方案为:
页面段get的参数进行加密:encodeURI(encodeURI(a.value));
后台接收时参数进行解密:UrlEncode.decode(request.getParameter("a"),"utf-8");

浏览器的传输使用的是utf-8编码


2.从后台传递参数到页面
后台传递参数到页面,准确的说是ajax到页面,因为如果是response.forward()会产生整个页面重画,它会按照content="text/html; charset=GBK"指定的gbk来解析,也就是不会出现乱码的情况。
而ajax只能采用默认编码来解析。默认编码为utf-8

解决方案为:
我们直接在后台的response中指定content="text/html; charset=UTF-8",这样ajax所返回的xml中的中文就可以正确的读取出来

 


结论:
content="text/html; charset=gbk"所指定的编码是文档的编码,因为html本身就是文档,这样可以确保文档中的文字不会乱码,也就是以文字输出不会产生乱码文字。
而iso-8859-1是浏览器对于get方式的url解析为参数时所使用的编码,庆幸的是基本上所有的浏览器都是使用这个编码。实际上浏览器的内部操作都是使用这个编码来运行的,包括运行js。它统一出这个编码是因为iso-8859-1是基本编码,所有的操作系统都支持,这是浏览器与平台无关的设计(本地语言环境字符编码有可能不能解析文档中指定的编码的部分文字)。因为我们不想与浏览器的编码机制有联系,所以我们会采用加密解密的方式去解决编码问题。
至于ajax的utf-8编码,我想不需要再做太多解释了。第一,ajax的技术采用的就是utf-8编码;第二,ajax返回的是一个xmlDOM模型,response中指定content="text/html; charset=UTF-8"则是表示文档的文字为utf-8的编码

另外浏览器的传输编码为utf-8

原创粉丝点击