参考资料: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. poj 1258 Agri-Net(Prim)(基础)

    Agri-Net Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 44487   Accepted: 18173 Descri ...

  2. RAM、ROM和磁盘

     计算机存储数据的存储器主要分为RAM(随机訪问存储器).ROM.磁盘. RAM又分为SRAM和DRAM两种,SRAM用作快速缓存,DRAM用作主存. 1.SRAM SRAM又被称为静态RAM.利 ...

  3. 实习生面试相关-b

    面试要准备什么 有一位小伙伴面试阿里被拒后,面试官给出了这样的评价:“……计算机基础,以及编程基础能力上都有所欠缺……”.但这种笼统的回答并非是我们希望的答案,所谓的基础到底指的是什么? 作为一名 i ...

  4. sdut 面向对象程序设计上机练习四(变量引用)

    面向对象程序设计上机练习四(变量引用) Time Limit: 1000MS Memory limit: 65536K 题目描写叙述 将变量的引用作为函数形參,实现2个int型数据交换. 输入 输入2 ...

  5. shell选择语句、循环语句

    判断语句:  if 判断条件  then    语句  [elif]    [语句]  ...  [else    语句]  fi    #!/bin/bash  if [ $# -eq 0 ]  t ...

  6. java里int类型转byte类型

    今天在做书上的一个例子的时候, 要使用byte类型,首先我很直接的就写到了byte b = 0XAA, 结果报错, 说从int转换到byte可能会有损失. 我当时就很奇怪, 为什么会出现这种情况呢? ...

  7. 菜鸟Sublime日记

            一.进行系统安装:www.sublimetext.com/3   选择相应的操作系统,你会发现安装速度惊人的快. 二.安装完成以后,先安装两个基本的插件package control ...

  8. Atom vim mode

    /******************************************************************** * Atom vim mode * 说明: * 想找一个具有 ...

  9. 并不对劲的bzoj2038:p1494:[国家集训队]小Z的袜子

    题目大意 有\(n\)(\(n\leq5*10^4\))个数\(a_1,a_2,...,a_n\)(\(\forall i\in[1,n], 1\leq a_i\leq n\)) \(m\)(\(m\ ...

  10. [转]Python3 字典 items() 方法

    原文Python3 字典 items()方法 描述 Python 字典 items() 方法以列表返回可遍历的(键, 值) 元组数组. 语法 items()方法语法: dict.items() 参数 ...