jsp url中中文参数的乱码解决

jsp url中中文参数的乱码解决


2024年4月12日发(作者:)

form有2中方法把数据提交给服务器,get和post,分别说下吧。

(一)get提交

1.首先说下客户端(浏览器)的form表单用get方法是如何将数据编码后提交给服

务器端的吧。

对于get方法来说,都是把数据串联在请求的url后面作为参数,如:

localhost:8080/servlet?msg=abc

(很常见的一个乱码问题就要出现了,如果url中出现中文或其它特殊字符的话,如:

localhost:8080/servlet?msg=杭州,服务器端容易得到乱码),url拼接完成后,

浏览器会对url进行URL encode,然后发送给服务器,URL encode的过程就是把部分

url做为字符,按照某种编码方式(如:utf-8,gbk等)编码成二进制的字节码,然后每个

字节用一个包含3个字符的字符串 "%xy" 表示,其中xy为该字节的两位十六进制表示形

式。我这里说的可能不清楚,具体介绍可以看下oder类的介绍在这里。

了解了URL encode的过程,我们能看到2个很重要的问题,第一:需要URL encode的

字符一般都是非ASCII的字符(笼统的讲),再通俗的讲就是除了英文字母以外的文字(如:

中文,日文等)都要进行URL encode,所以对于我们来说,都是英文字母的url不会出

现服务器得到乱码问题,出现乱码都是url里面带了中文或特殊字符造成的;第二:URL

encode到底按照那种编码方式对字符编码?这里就是浏览器的事情了,而且不同的浏览

器有不同的做法,中文版的浏览器一般会默认的使用GBK,通过设置浏览器也可以使用

UTF-8,可能不同的用户就有不同的浏览器设置,也就造成不同的编码方式,所以很多网

站的做法都是先把url里面的中文或特殊字符用javascript做URL encode,然后再拼接

url提交数据,也就是替浏览器做了URL encode,好处就是网站可以统一get方法提交数

据的编码方式。 完成了URL encode,那么现在的url就成了ASCII范围内的字符了,然

后以iso-8859-1的编码方式转换成二进制随着请求头一起发送出去。这里想多说几句的

是,对于get方法来说,没有请求实体,含有数据的url都在请求头里面,之所以用URL

encode,我个人觉的原因是:对于请求头来说最终都是要用iso-8859-1编码方式编码成

二进制的的纯数据在互联网上传送,如果直接将含有中文等特殊字符做

iso-8859-1编码会丢失信息,所以先做URL encode是有必要的。

2。服务器端(tomcat)是如何将数据获取到进行解码的。

第一步是先把数据用iso-8859-1进行解码,对于get方法来说,tomcat获取数据的

是ASCII范围内的请求头字符,其中的请求url里面带有参数数据,如果参数中有中文等

特殊字符,那么目前还是URL encode后的%XY状态,先停下,我们先说下开发人员一般

获取数据的过程。通常大家都是ameter("name")获取参数数据,我们在

request对象或得的数据都是经过解码过的,而解码过程中程序里是无法指定,这里要说

下,有很多新手说用racterEncoding("字符集")可以指定解码方式,其实

是不可以的,看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请求带中文参数为什么

在服务器端得到乱码了,原因是在客户端一般都是用UTF-8或GBK对数据URL encode,

这里用iso-8859-1方式URL decoder显然不行,在程序里我们可以直接

Java代码

new String(ameter("name").getBytes("iso-8859-1"),"客户端指定

的URL encode编码方式")

new String(ameter("name").getBytes("iso-8859-1"),"客户端指定

的URL encode编码方式")

还原回字节码,然后用正确的方式解码数据,网上的文章通常是在tomcat里面做个

配置

本人的解决方法:在js中将参数进行编码

[

href="javascript:goToPage('${e}','${currentYear}','${currentMonth}','${c

e}')">

]


发布者:admin,转转请注明出处:http://www.yc00.com/news/1712898614a2144131.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信