2022年参数传递中编码问题 .pdf

上传人:C****o 文档编号:33683687 上传时间:2022-08-12 格式:PDF 页数:3 大小:37.38KB
返回 下载 相关 举报
2022年参数传递中编码问题 .pdf_第1页
第1页 / 共3页
2022年参数传递中编码问题 .pdf_第2页
第2页 / 共3页
点击查看更多>>
资源描述

《2022年参数传递中编码问题 .pdf》由会员分享,可在线阅读,更多相关《2022年参数传递中编码问题 .pdf(3页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、参数传递中编码问题( Get/Post 方式)做 java 的 web开发有段日子了,有个问题老是困扰着我,就是乱码问题,基本上是网上查找解决方案 (网上资料真的很多) ,都是一大堆的介绍如何解决此类的 乱码问题,但是没几个把问题的来龙去脉说清楚的,有时候看了些文章后,以为自己懂了, 但是在开发中乱码问题又像鬼魂一样出来吓人,真是头大了! 这篇文章是我长时间和乱码做斗争的一些理解的积累,还希望有更多的朋友给出指点和补充。form 有 2 中方法把数据提交给服务器,get 和 post , 分别说下吧。(一) get 提交1. 首先说下客户端(浏览器)的form 表单用 get 方法是如何将数据

2、编码后提交给服务器端的吧。对于 get 方法来说,都是把数据串联在请求的url 后面作为参数,如:http:/localhost:8080/servlet?msg=abc (很 常见的一个乱码问题就要出现了,如果url中出现中文或其它特殊字符的话, 如: http:/localhost:8080 /servlet?msg= 杭州, 服务器端容易得到乱码) ,url 拼接完成后,浏览器会对 url 进行 URL encode, 然后发送给服务器,URL encode的过程就是把部分url 做为字符,按照某种编码方式(如:utf-8,gbk等)编码成二进制的字节码,然后每个字节用一个包含3 个字符

3、的字符串 %xy 表示,其中 xy 为该字节的两位十六进制表示形式。我这里说的可能不清楚,具体介绍可以看下 .URLEncoder类的介绍在这里。了解了 URL encode 的过程,我们能看到 2 个很重要的问题, 第一:需要 URL encode 的字符一般都是非ASCII的字符(笼统的讲),再通俗的讲就是除了英文字母以外的文字(如:中文,日文等)都要进行 URL encode ,所以对于我们来说,都是英文字母的url 不会出现服务器得到乱码问题, 出现乱码都是 url 里面带了中文或特殊字符造成的;第二: URL encode 到底按照那种编码方式对字符编码?这里就是浏览器的事情了,而且

4、不同的浏览器有不同的做法,中文版的浏览器一般会默认的使用GBK ,通过设置 浏览器也可以使用UTF-8,可能不同的用户就有不同的浏览器设置,也就造成不同的编码方式,所以很多网站的做法都是先把url 里面的中文或特殊字符用 javascript做 URL encode,然后再拼接 url 提交数据,也就是替浏览器做了 URL encode,好处就是网站可以统一get 方法提交数据的编码方式。完成了 URL encode,那么现在的 url 就成了 ASCII 范围内的字符了,然后以iso-8859-1的编码方式转换成二进制随着请求头一起发送出去。这里想多说几句的是,对于 get 方法来说,没有请

5、求实体, 含有数据的 url 都在请求头里面,之所以用 URL encode ,我个人觉的原因是:对于请求头来说最终都是要用iso-8859-1编码方式编码成二进制的101010.的纯数据在互联网上传送,如果直接将含有中文等特殊字符做iso-8859-1编码会丢失信息,所以先做URL encode 是有必要的。 2 。服务器端( tomcat )是如何将数据获取到进行解码的。第一步是先把数据用iso-8859-1进行解码,对于 get 方法来说, tomcat 获取数据的是 ASCII 范围内的请求头字符, 其中的请求 url 里面带有参数数据, 如果参数中有中文等特殊字符, 那么目前还是 U

6、RL encode 后的%XY 状态,先停下,名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 3 页 - - - - - - - - - 我们先说下开发人员一般获取数据的过程。通常大家都是request.getParameter(name)获 取参数数据,我们在request 对象或得的数据都是经过解码过的, 而解码过程中程序里是无法指定,这里要说下, 有很多新手说用 request.setCharacterEncoding(字符集 ) 可以指定解码方式,其实是不可以的,

7、看 servlet的官方 API 说明有对此方法的解释: Overrides the name of the character encoding used in the body of this request. This method must be called prior to reading request parameters or reading input using getReader().可以看出对于 get 方法他是无能为力的。那么到底用什么编码方式解码数据的呢,这是tomcat 的事情了,默认缺省用的是 iso-8859-1,这样我们就能找到为什么get 请求带中文参数

8、为什么在服务器端得到乱码了,原因是在客户端一般都是用UTF-8或 GBK 对数据 URL encode,这里用 iso-8859-1方式URL decoder 显然不行,在程序里我们可以直接Java 代码 1. new String(request.getParameter(name).getBytes(iso-8859-1),客户端指定的 URL encode编码方式 ) 还原回字节码,然后用正确的方式解码数据,网上的文章通常是在tomcat 里面做个配置Xml代码 1. 这样是让 tomcat 在获取数据后用指定的方式URL decoder,URL decoder 的介绍在这里(一) po

9、st 提交1. 客户端(浏览器)的form 表单用 post 方法是如何将数据编码后提交给服务器端的。在 post 方法里所要传送的数据也要URL encode,那么他是用什么编码方式的呢?在 form 所在的 html 文件里如果有段 ,那么 post 就会用此处指定的编码方式编码。一般大家都认为这段代码是为了让浏览器知道用什么字符集来对网页解释,所以网站都会把它放在html 代码的最前端,尽量不出现乱码,其实它还有个作用就是指定 form 表单的 post 方法提交数据的 URL encode 编码方式。从这里可以看出对于get 方法来数,浏览器对数据的URL encode 的编码方式是有

10、浏览器设置来决定,(可以用 js 做统一指定),而 post 方法,开发人员可以指定。2。服务器端( tomcat )是如何将数据获取到进行解码的。如果用 tomcat 默认缺省设置,也没做过滤器等编码设置,那么他也是用iso-8859-1解码的,但是 request.setCharacterEncoding(字符集 ) 可以派上用场。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 3 页 - - - - - - - - - 我发现上面说的tomcat 所做的事情前提都是在请求头里没有指定编码方式,如果请求头里指定了编码方式将按照这种方式编码。有 2 篇文章推荐下,地址分别是深入浅出 URL编码:http:/ post 方法提交数据时乱码问题:http:/ post 很重要的在 form 所在的 html 文件里如果有段 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 3 页 - - - - - - - - -

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁