post和get提交服务器编码过程

参考资料:http://blog.csdn.net/z55887/article/details/46975679

先说出一个知识点:

如果浏览器端编码是UTF-8,那在服务器端解决乱码问题的方法有两种:

浏览器提交数据到web服务器的方式:

Post方式

request.setCharacterEncoding(“UTF-8");

Get方式

String param =request.getParameter(“param”);

Stringnewparam = new String( param.getBytes("iso-8859-1"),“utf-8”);

为什么POST和GET有差别?还有UTF-8和ISO-8859-1的区别到底是什么?字符从浏览器到服务器端的编码过程又是怎样的?

带这这些疑问,我查了好几天资料,总算得到一个自己还算满意的答案,先总结分享下自己的理解,水平有限,有错误的话以后再慢慢改正。

1.首先说下字符编码的基础知识:

开始时先出现的编码是ASCII码,美国制定的字符编码,可以把许多符号英文等表示成数字,例如空格是32。这个编码一共规定了128个字符,即7位,用一个字节就可以表示全部的英语了。

但是世界上语言是很多的,像中国这样图案性的文字只能一个一个的表示,汉字有10万以上,显然用ASCII码表示是不够的,这时就出现了一种表示简体中文的字符编码GB2323,由两个字节表示一个汉字,可以表示常用的256*256=65536个常用汉字。

语言有那么多种,可不可以有一种表示全部语言的字符编码呢?所以出现了Unicode,即用一个很大的文字集合编码表示所有国家的文字,如 0100-017F:拉丁文扩展-A (Latin Extended-A),0600-06FF:阿拉伯文 (Arabic)

但问题又出现了,如果都采用Unicode字符编码的话会给字符存储带来极大的浪费,例如统一使用4个字节表示所有字符,那对于只需要用1个字节就可以全部表示的英语,真是浪费了太多空间啊,所以这时候出现了折中的方案,即UTF-8,一种Unicode的实现方案,使用可变的编码方式表示所有文字,根据字符的不同改变字节长度。其余的Unicode的实现方案也提下:UTF-16(字符用两个字节或四个字节表示)和UTF-32(字符用四个字节表示)

最后说下ISO-8859-1,它是一种单字节的编码方式,向下兼容ASCII,部分支持欧洲使用的语言,servlet端默认是使用这个编码方式的

2.再说下POST和GET两种方式传递数据的区别,以及为什么用上面的代码解决乱码问题

POST是将数据放在HTTP请求体中,GET是将数据放在HTTP请求行中URL里。

request.setCharacterEncoding(“UTF-8");是设置服务器端接收请求体的编码格式,对服务器端接受URL的编码格式无影响,所有不能采用此办法来解决GET乱码问题。如果想解决两种传递数据的乱码问题,可以在tomcat的server.xml中,设置元素的属性URIEncoding="UTF-8”,useBodyEncodingForURI="true",则post和get都是UTF-8编码了

3.最后说下字符从浏览器到服务器端的编码过程

Post方式

request.setCharacterEncoding(“UTF-8");

例如浏览器端传的数据为“你好“,浏览器默认编码格式是UTF-8,编码后变为0x4F60,0x597D,一共4个字节,然后传到服务器端,由于设置了上面的方法,浏览器接收了二进制数后采用UTF-8解码,就把0x4F60,0x597D又变成了”你好“

 

Get方式

String param =request.getParameter(“param”);

String newparam = new String( param.getBytes("iso-8859-1"),“utf-8”);

例如浏览器端传的数据为“你好“,编码后变为0x4F60,0x597D。传到服务器,由于服务器端对URL的默认解码是ISO-8859-1,故把0x4F60,0x597D变成了"&*",这时候如果直接输出就会发现是乱码。所以先用getBytes把param按ISO-8859-1的编码解码成为0x4F60,0x597D,再用UTF-8的编码重新编成了”你好“

好了,终于完了,最后贴几个参考博文的链接吧:

get,post的乱码处理:

http://blog.csdn.net/luyuncsd123/article/details/8453526

http://blog.sina.com.cn/s/blog_ad1c3bdf0102uz99.html

字符编码:

http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html

时间: 2024-08-26 09:47:05

post和get提交服务器编码过程的相关文章

GET&&POST请求编码过程

编码.解码 我们在开发过程中不可避免的一个话题就是编码和解码,那么什么是编码什么是解码呢?为什么要进行编码和解码呢?下面我们一一分析! 编码和解码的概念 编码是信息从一种形式或格式转换为另一种形式的过程也称为计算机编程语言的代码简称编码.用预先规定的方法将文字.数字或其它对象编成数码,或将信息.数据转换成规定的电脉冲信号.编码在电子计算机.电视.遥控和通讯等方面广泛使用.编码是信息从一种形式或格式转换为另一种形式的过程.解码,是编码的逆过程.例如:"我是中国人!"按照UTF-8编码后为

linux服务器启动过程

随着Linux的应用日益广泛,特别是在网络应用方面,有大量的网络服务器使用Linux操作系统.由于Linux的桌面应用和Windows相比还有一 定的差距,所以在企业应用中往往是Linux和Windows操作系统共存形成异构网络.在服务器端大多使用Linux和Unix的,目前Linux的擅 长应用领域是单一应用的基础服务器应用,譬如DNS和DHCP服务器.Web服务器.目录服务器.防火墙.文件和打印服务器.Intranet代理服务器 .启动 Linux 系统的过程包括很多阶段.不管您是引导一个标

[转]windows 7系统搭建本地SVN服务器的过程

windows 7系统搭建本地SVN服务器的过程 1.安装svn:TortoiseSVN-1.7.9.23248-x64-svn-1.7.6; 1.在PC机的D盘创建如下目录:D:\svn\project\workspace; 2.右键点击目录workspace文件,选择Tortoise->Create repository here,即在此创建版本库(Y); 然后你就会看到D:\svn\project\workspace 里面多了conf, db, hooks, lock等文件,版本库创建成功

Storm集群上的开发 ,Storm的内部原理,storm提交任务的过程 (八)

storm提交任务的过程: 1.客户端通过storm提交topology 2.nimbus主节点创建本地topology任务目录.tmp 3.nimbus监控zookeeper心跳,计算工作量. 4.nimbus向zookeeper分配任务. 5.从节点监控zk的数据,一旦有新任务分配,启动任务topology.. 6.从zk上获取分配给自己的task任务,启动对应的worker进程.

Cacti监控Tomcat服务器实现过程

1 首先去官网上面下载通用的监控模板 一般使用TomcatStats-0.1.zip 模板居多,下载地址: http://forums.cacti.net/download/file.php?id=12310, 在linux服务器上面使用wget下载,wget http://forums.cacti.net/download/file.php?id=12310,报如下错误: 正在连接 forums.cacti.net|173.225.179.10|:80... 已连接. 已发出 HTTP 请求,

Node.js, Express的服务器搭建过程的问题

Node.js, Express的服务器搭建过程的问题 Express : node.js 的框架,根据2012年BYvoid的说法,是node.js官方唯一推荐的框架 怎么搭建项目? - 安装nodejs->npm->express - express 的问题: 2017年, express-generator已经被独立成命令行工具了,所以要用 npm install express-generator 这样才能用express命令 怎么启动项目? 启动服务器可以用node app.js,因

Cacti监控mysql数据库服务器实现过程

Cacti监控mysql数据库服务器实现过程 2014-05-29      0个评论    来源:Cacti监控mysql数据库服务器实现过程   收藏    我要投稿 1 先在cacti服务器端安装mysql模板 wget https://mysql-cacti-templates.googlecode.com/files/better-cacti-templates-1.1.8.tar.gz tar –xvf better-cacti-templates-1.1.8.tar.gz cd b

SSL服务器认证过程通俗理解!

理解有错误的地方,请高手指正! 1,CA中心,有一套自己的公钥和私钥,服务器用自己的私钥去生成一个自认证的证书 2,CA中心的自认证证书是有公信力的,一般被客户端所熟知,发放到每个客户端! 3,客户端需要将CA中的自认证证书加入信任列表! 4,服务器要加入CA体系,要向CA中心申请,CA中心验证了服务器的资料后,向server发放一个证书(key),里面包含了一个秘钥 5,CA发给server的证书是用CA自己的秘钥和申请者的秘钥(key)加密过的, 6,证书里面包含:申请者的身份信息.申请者公

记一次公司仓库服务器死锁过程

记一次公司仓库服务器死锁过程 仓库拣货卡死,排查了数据库的很多地方,都没有头绪,最后到SQL Server 错误日志里查看,终于发现了蛛丝马迹 EXEC xp_readerrorlog 0,1,NULL,NULL,'2015-09-21','2015-10-10','DESC' waiter id=process5c30e08 mode=U requestType=wait waiter-list owner id=process5c26988 mode=X owner-list keylock