参考资料: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提交服务器编码过程的更多相关文章

  1. GET&&POST请求编码过程

    编码.解码 我们在开发过程中不可避免的一个话题就是编码和解码,那么什么是编码什么是解码呢?为什么要进行编码和解码呢?下面我们一一分析! 编码和解码的概念 编码是信息从一种形式或格式转换为另一种形式的过 ...

  2. pdb 源码索引符号服务器创建过程

    pdb是调试程序必不可少的东西,它保存着一个exe或dll的调试信息,对pdb进行源码索引可以快速找到软件对应该版本的代码,本文以subversion版本控制服务器进行介绍 一.需要安装的软件 win ...

  3. js ajax post提交 ie和火狐、谷歌提交的编码不一致,导致中文乱码

    今天遇到一个问题找了很久发现: 使用js ajax post提交 ie和火狐.谷歌提交的编码不一致,导致中文乱码 //http://www.cnblogs.com/QGC88 $.ajax({ url ...

  4. 使用ffmpeg视频编码过程中踩的一个坑

           今天说说使用ffmpeg在写视频编码程序中踩的一个坑,这个坑让我花了好多时间,回头想想,非常多时候一旦思维定势真的挺难突破的.以下是不对的编码结果:                   ...

  5. 推荐2一个在Java编码过程中得心应手的工具

    推荐2在编码过程中的减小不仅编码的量,挺easy工具上手:可适用Java反思与单探头Assert. 1 Mirror:Java反思 简单介绍 官网:http://projetos.vidageek.n ...

  6. mysql设置服务器编码

    今天写java程序的时候出现了插入mysql数据中文乱码问题,确定数据库和表的编码都已指定utf-8.百度后得知mysql安装后需设置服务器编码,以下是解决方法(ubuntu; mysql 5.6.2 ...

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

    Cacti监控mysql数据库服务器实现过程 2014-05-29      0个评论    来源:Cacti监控mysql数据库服务器实现过程   收藏    我要投稿 1 先在cacti服务器端安 ...

  8. java中文乱码解决之道(七)-----JSP页面编码过程

    我们知道JSP页面是需要转换为servlet的,在转换过程中肯定是要进行编码的.在JSP转换为servlet过程中下面一段代码起到至关重要的作用. <%@ page language=" ...

  9. JS之表单提交时编码类型enctype详解

    简介 form的enctype属性为编码方式,常用有两种:application/x-www-form-urlencoded和multipart/form-data,默认为application/x- ...

随机推荐

  1. C#构造方法(函数) C#方法重载 C#字段和属性 MUI实现上拉加载和下拉刷新 SVN常用功能介绍(二) SVN常用功能介绍(一) ASP.NET常用内置对象之——Server sql server——子查询 C#接口 字符串的本质 AJAX原生JavaScript写法

    C#构造方法(函数)   一.概括 1.通常创建一个对象的方法如图: 通过  Student tom = new Student(); 创建tom对象,这种创建实例的形式被称为构造方法. 简述:用来初 ...

  2. 《Java设计模式》之訪问者模式

    訪问者模式是对象的行为模式.訪问者模式的目的是封装一些施加于某种数据结构元素之上的操作.一旦这些操作须要改动的话,接受这个操作的数据结构则能够保持不变. 分派的概念 变量被声明时的类型叫做变量的静态类 ...

  3. vue入门教程 (vueJS2.X)

    vue入门教程vueJS2.X 写在前面 看完此教程可以达到:能看懂并能修改简单的vue项目. 看的过程中,请把所有例子都放到html文件中跑一遍. Vue.js 是什么 Vue.js(读音 /vju ...

  4. <label>标签for属性

    label 元素不会向用户呈现任何特殊效果.不过,它为鼠标用户改进了可用性.如果您在 label 元素内点击文本,就会触发此控件.就是说,当用户选择该标签时,浏览器就会自动将焦点转到和标签相关的表单控 ...

  5. linux怎么区别文本文件和二进制文件

    linux的文本文件与二进制文件的区分与windows的区分是相同的!说到底计算机存储的文件都是以二进制形式存储的,但是区别是,习惯上认为: (1).文本文件 文本文件是包含用户可读信息的文件.这些文 ...

  6. MARGIN-BEFORE MARGIN-AFTER MARGIN-START MARGIN-END

    总的来说:这是CSS3.0的对于文章段P容器的定义方法语句!display:block这个样式,只定义了P容器为一个块;后面四句是CSS3中的样式定义方法:-webkit-margin-before: ...

  7. 闲得蛋疼,JavaScript版本BadApple

    参考Vim版本的BadApple改写而成.由于加载数据比较大,可能网速不给力的童鞋效果不太好,多刷新几次就好了,^_^.运行环境:支持HTML5 Canvas的浏览器.​1. 代码:$(functio ...

  8. HTTP传输二进制初探

    [转]HTTP传输二进制初探 http://www.51testing.com/?uid-390472-action-viewspace-itemid-233993 [转]HTTP传输二进制初探 上一 ...

  9. rsync+inotify 实现实时同步

    inotify:这个可以监控文件系统中的添加,修改,删除,移动等事件 inotify的特性需要linux内核2.6.13以上的支持 [root@test1 inotify-tools-3.13]# u ...

  10. [转]python的startswith()方法

    描述 Python startswith() 方法用于检查字符串是否是以指定子字符串开头,如果是则返回 True,否则返回 False.如果参数 beg 和 end 指定值,则在指定范围内检查. 语法 ...