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
post和get提交服务器编码过程的更多相关文章
- GET&&POST请求编码过程
编码.解码 我们在开发过程中不可避免的一个话题就是编码和解码,那么什么是编码什么是解码呢?为什么要进行编码和解码呢?下面我们一一分析! 编码和解码的概念 编码是信息从一种形式或格式转换为另一种形式的过 ...
- pdb 源码索引符号服务器创建过程
pdb是调试程序必不可少的东西,它保存着一个exe或dll的调试信息,对pdb进行源码索引可以快速找到软件对应该版本的代码,本文以subversion版本控制服务器进行介绍 一.需要安装的软件 win ...
- js ajax post提交 ie和火狐、谷歌提交的编码不一致,导致中文乱码
今天遇到一个问题找了很久发现: 使用js ajax post提交 ie和火狐.谷歌提交的编码不一致,导致中文乱码 //http://www.cnblogs.com/QGC88 $.ajax({ url ...
- 使用ffmpeg视频编码过程中踩的一个坑
今天说说使用ffmpeg在写视频编码程序中踩的一个坑,这个坑让我花了好多时间,回头想想,非常多时候一旦思维定势真的挺难突破的.以下是不对的编码结果: ...
- 推荐2一个在Java编码过程中得心应手的工具
推荐2在编码过程中的减小不仅编码的量,挺easy工具上手:可适用Java反思与单探头Assert. 1 Mirror:Java反思 简单介绍 官网:http://projetos.vidageek.n ...
- mysql设置服务器编码
今天写java程序的时候出现了插入mysql数据中文乱码问题,确定数据库和表的编码都已指定utf-8.百度后得知mysql安装后需设置服务器编码,以下是解决方法(ubuntu; mysql 5.6.2 ...
- Cacti监控mysql数据库服务器实现过程
Cacti监控mysql数据库服务器实现过程 2014-05-29 0个评论 来源:Cacti监控mysql数据库服务器实现过程 收藏 我要投稿 1 先在cacti服务器端安 ...
- java中文乱码解决之道(七)-----JSP页面编码过程
我们知道JSP页面是需要转换为servlet的,在转换过程中肯定是要进行编码的.在JSP转换为servlet过程中下面一段代码起到至关重要的作用. <%@ page language=" ...
- JS之表单提交时编码类型enctype详解
简介 form的enctype属性为编码方式,常用有两种:application/x-www-form-urlencoded和multipart/form-data,默认为application/x- ...
随机推荐
- input 文本框禁止输入表情
js在用户输入表情时自动过滤掉 <input type="text" id="input" maxlength="10"/> v ...
- Windows和linux双系统——改动默认启动顺序
电脑上装了Windows 7和Ubantu双系统,因为Linux系统用的次数比較少而且还是默认的启动项对此非常不能容忍,因此得改动Windows为默认的启动项. 因为电脑上的系统引导程序是GRUB,因 ...
- 异或巧用:Single Number
异或巧用:Single Number 今天刷leetcode,碰到了到题Single Number.认为解答非常巧妙,故记之... 题目: Given an array of integers, ev ...
- Python 点滴 I
[为什么使用Python] 1. 软件质量: Python更注重软件质量,一致性,可维护性 2. 开发效率: 相比C/C++/Java这些编译/静态语言,无需编译及链接步骤,Python所须要 ...
- enumerateObjectsUsingBlock 、for 、for(... in ...) 的差别 & 性能測试
for VS for(... in ...) for 的应用范围广基本能够NSArray.NSArray以及C语言的数组等,而for(... in ...)仅限于NSArray.NSArray等 fo ...
- string 是值类型,还是引用类型(.net)[转]
转自http://hi.baidu.com/newfzks/item/b805f0f4edb0810dd89e7290 string 是值类型,还是引用类型(.net) 一. string 类型的用法 ...
- 【iOS系列】-xib封装使用
[iOS系列]-xib封装使用 Xib文件可以用来描述某一块局部的UI界面 Xib文件的加载 修改xib文件的大小size(Freeform) 第一: NSArray *objs = [[NSBund ...
- Boost中的Timer的使用——计算时间流逝
使用Boost中的Timer库计算程序的运行时间 程序开发人员都会面临一个共同的问题,即写出高质量的代码完毕特定的功能.评价代码质量的一个重要标准就是算法的运行效率,也就是算法的运行时间.为了可靠的提 ...
- 【小技能】如何检索苹果APP
有时候要临时在PC上查询一下苹果APP的信息,但是又没有安装itunes软件,那么你可以在必应里面使用类似如下的语句,例如来搜索“aboboo site:itunes.apple.com”,就可以搜索 ...
- Vue框架之组件系统
1,Vue组件系统之全局组件 1.1Vue全局组件的在实例化调用Vue的模板中导入组件的名称 <!DOCTYPE html> <html lang="zh-cn" ...