如何解决request.getparameter中文乱码取值乱码问题

再次小结ServletRequest.getParameter乱码问题 - 季浩的BLOG - ITeye技术网站
博客分类:
情况之一:没有编码URL
var url = "./SuggestServlet?tagName="+document.getElementById('tagName').
做一个AJAX请求到SuggestServlet,参数是中文字符串,(传递到容器,由容器决定采用何种编码解析)
到Servlet之后取这个参数 String myparam = request.getParameter("tagName");
得到的是一个乱码字符串,request.getCharacterEncoding() 得到的是一个null值,这时候tomcat默认的是ISO-8859-1编码解析,这就是我们得到乱码的原因了。
解决办法:
myparam = new String(myparam.getBytes("ISO-8859-1"),"UTF-8"); 这样就能得到中文了
情况之二:使用javascript的encodeURI编码中文参数
"./SuggestServlet?tagName="+encodeURI(document.getElementById('tagName').value);
同样是做一个AJAX请求到SuggestServlet,这时候参数被编码过了
到Servlet之后取这个参数 String myparam = request.getParameter("tagName");
得到的是UTF-8编码之后的字符串,其实不是乱码。
要获得中文字符,我们还需要再转换一次编码String decodingParam = URLDecoder.decode(myparam, "UTF-8");
---------------------------------------------------------------------------------------------------------------------
补充:做URL请求之前,应该使用JavaScript encodeURL(url)
---------------------------------------------------------------------------------------------------------------------
论坛回复 /
(3 / 5089)
encodeURI
qiuggv 写道
encodeURI()方法是按照什么来编码的? ie下如果把总是以utf-8 发送的勾选去了,那么应该会按照contenttype来编码吧?这样和客户端浏览器相关,后台就不好确定是否用utf-8转回来了 encodeURL用的是UTF-8的编码,通过JavaScript编码的方式是能保证后台得到正确数据的
encodeURL用的是Base64编码
encodeURI()方法是按照什么来编码的? ie下如果把总是以utf-8 发送的勾选去了,那么应该会按照contenttype来编码吧?这样和客户端浏览器相关,后台就不好确定是否用utf-8转回来了
encodeURL用的是UTF-8的编码,通过JavaScript编码的方式是能保证后台得到正确数据的
jacky.jihao
浏览: 90697 次
来自: 上海
非常感谢楼主的无私奉献,最近正在做一个搜索引擎前端的开发,看了 ...
谢谢是分享。。
嗯,是,比方我在根节点下有7个子element,循环存的时候用 ...
/admin/ ...当前访客身份:游客 [
奉我们主耶稣基督的名。阿们!
:引用来自“VilenEera”的评论 firefox 的有没 打...
:firefox 的有没
:这个叫并行赋值
今日访问:18
昨日访问:9
本周访问:62
本月访问:276
所有访问:7609
JSP中request.getParameter()乱码问题
发表于3年前( 00:25)&&
阅读(295)&|&评论()
0人收藏此文章,
博客分类:&
第一,存文件必须以一种编码存;读文件也必须以一种编码读,如不特别设置,去系统默认的编码,中文windows为GBK编码。
从.java-&.class过程是,先编写.java文件并按莫种编码方式保存,然后用javac方法编译此文件,注意如.java没按系统默认编码保存则要带encoding参数指明实际编码,否则出错,生成的.class文件存为系统默认编码。
从.jsp-&.java-&.class,先存为某种编码的.jsp文件,然后tomcat根据pageEncoding读取并转化为servlet存为系统默认编码,然后同上面.java-&.class过程。
第二,IDE的encoding为对系统下文件打开的解码方式或保存的编码方式。特例:如果.jsp文件有&%@ page language=&java& pageEncoding=&UTF-8&%&,则eclipse会自动存为UTF-8方式,不管eclipse的encoding是什么,这也是eclipse的聪明之处。
第三, pageEncoding=&UTF-8&表示此文件的编码方式,必须与此文件存储方式一致(所以eclipse会首选根据它来存文件),tomcat根据这个来读此.jsp文件并编译为servlet。 contentType=&text/charset=UTF-8&表示当浏览器得到此文件时以什么方式解码。例如: &%@ page language=&java& pageEncoding=&UTF-8&%& &%@ page contentType=&text/charset=iso8859-1&%& &html& &head& &title&test&/title& &/head& &body& 我是个好人 &/body& &/html& 会产生乱码,因为存为UTF-8的文件被解码为iso8859-1,这样 如有中文肯定出乱码。
至此,页面应为: &%@ page language=&java& pageEncoding=&UTF-8&%& &%@ page contentType=&text/charset=UTF-8&%& &html& &head& &title&中文问题&/title& &meta http-equiv=&Content-Type& content=&text/ charset=UTF-8&& &/head& &/html&
第四, request.setCharacterEncoding(&UTF-8&)是把提交内容的字符集设为UTF-8 response.setCharacterEncoding(&UTF-8&)可以把页面中的&%@ page contentType=&text/charset=iso8859-1&%&换为charset=UTF-8,是给告诉浏览器我这个文件的编码方式。
第五,表单提交:无论何种表单提交都可以在后台的java文件中通过String des = new String(s.getBytes(&iso8859-1&),&UTF-8&);来转换成你想要的UTF-8编码方式。但如果每处都加词句太麻烦,故分post和get两种方式区分提交(tomcat5以后分开处理,之前处理方式一样,即都可以用request.setCharacterEncoding(&UTF-8&)方法处理,不过tomcat5以后get提交方法用此语句无效)。 1,post提交的数据:& 程序加上org.springframework.web.filter.CharacterEncodingFilter过滤器.& &filter&& &filter-name&encodingFilter&/filter-name&& &filter-class&org.springframework.web.filter.CharacterEncodingFilter&/filter-class&& &init-param&& &param-name&encoding&/param-name&& &param-value&UTF8&/param-value&& &/init-param&& &init-param&& &param-name&forceEncoding&/param-name&& &param-value&true&/param-value&& &/init-param&& &/filter&&
&filter-mapping&& &filter-name&encodingFilter&/filter-name&& &url-pattern&*.html&/url-pattern&& &/filter-mapping&& &filter-mapping&& &filter-name&encodingFilter&/filter-name&& &url-pattern&*.jsp&/url-pattern&& &/filter-mapping&&
因为规范要求浏览器提交数据都要用utf8编码,所以这里设置编码方式为UTF8.&
特别注意:& a,这个过滤器只是简单的调用:request.setCharacterEncoding(this.encoding);& 在这个语句之前不能调用任何的request.getParameter()方法,否则会设置tomcat的缺省字符集为&ISO-8859-1&,并且使setCharacterEncoding的调用失效.所以在这个过滤器之前的过滤器中不能有对getParameter这类方法的调用,比较安全的做法就是把这个过滤器尽量靠前放.& b,在server.xml中不能加上&Valve className=&org.apache.catalina.valves.RequestDumperValve&/&& 这个value也设置tomcat的缺省字符集为&ISO-8859-1&,使setCharacterEncoding的调用失效.可能其他的value也有这个问题,我没有测试过.& 如果要观察http请求参数,可以考虑用过滤器或者其他工具,例如ethereal()&
2,get提交的数据:& 两种情况:& a,如果从地址栏直接输入汉字,则一般编码为&GBK&,需要用& new String(request.getParameter(&something&).getBytes(&ISO-8859-1&),&GBK&)& 取出& b,如果是页面超连接连接中带的汉字,则编码根据页面编码的不同而不同,如果页面的& content=&text/ charset=utf-8&,则在tomcat/conf/server.xml中的配置文件中:& &!-- Define a non-SSL Coyote HTTP/1.1 Connector on port 8080 --&& &Connector port=&8080&& maxThreads=&150& minSpareThreads=&25& maxSpareThreads=&75&& enableLookups=&false& redirectPort=&8443& acceptCount=&100&& debug=&0& connectionTimeout=&20000& useBodyEncodingForURI=&true&& disableUploadTimeout=&true& /&&
加上:useBodyEncodingForURI=&true&即可正常使用getParameter取出正确内容.& 如果content=&text/ charset=GBK&,需用& new String(request.getParameter(&something&).getBytes(&ISO-8859-1&),&GBK&)& 取出,其他情况类似.&
总结:& 1,所有页面使用utf8编码,& 2,服务器加上过滤器,& 3,server.xml中不要使用& &Valve className=&org.apache.catalina.valves.RequestDumperValve&/&& 4,server.xml文件加上useBodyEncodingForURI=&true&& 这样应该可以搞定大多数前台的中文问题.至于地址栏输入中文,不支持也罢,一般的程序很少要求& 从这里输入.
第六,连接数据库&
1、mysql配置文件: 修改mysql在windows\my.ini里default-character-set=utf-8
2、mysql里数据库和表也都设为utf8_unicode_ci
3、数据库连结:jdbc:mysql://localhost/mydb?useUnicode=true&characterEncoding=utf-8 注意,关键就在于此:此句中间是'&'不是'&'这是因为数据库连结时,在.jsp和.java文件中应该用&号,而XML文件中需要用&
对于Web容器来说,如果你不设置,默认是ISO8859-1 String des = new String(s.getBytes(&iso8859-1&),&UTF-8&);都可以使用这个 不论哪里,有乱码就是用。
====================================================================
最近在准备考试系统的开发,碰到了 request.getParameter乱码的问题。跟林彬讨论了一下,还是觉得用老方法管用。
如果是post的话,可以通过设置filter的方法来解决。
如果是get或者是超链接的话,以前是通过设置tomcat的配置文件server.xml来解决的,但这样不好,并不是所有的项目,我们都可以修改到服务器的tomcat的配置文件。具体代码如下:
1: Connector port=&8080& maxHttpHeaderSize=&8192&
2: maxThreads=&150& minSpareThreads=&25& maxSpareThreads=&75&
3: enableLookups=&false& redirectPort=&8443& acceptCount=&100&
4: connectionTimeout=&20000& disableUploadTimeout=&true& uRIEncoding=&gbk&/&
还是觉得老方法管用,只是有点麻烦:
& & &1: String id=new String(request.getParameter(&id&).getBytes(&ISO8859-1&),&UTF-8&);
2: String name = new String(request.getParameter(&name&).getBytes(&ISO8859-1&),&UTF-8&);
1)">1)">1" ng-class="{current:{{currentPage==page}}}" ng-repeat="page in pages"><li class='page' ng-if="(endIndex<li class='page next' ng-if="(currentPage
相关文章阅读扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
request&#46;getParameter&#40;&#41;取值乱码解决办法
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口request.getParameter()取值乱码
[问题点数:20分,结帖人yczyh364]
request.getParameter()取值乱码
[问题点数:20分,结帖人yczyh364]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
本帖子已过去太久远了,不再提供回复功能。1484人阅读
package cn.itcast.web.
import java.io.IOE
import java.io.UnsupportedEncodingE
import java.util.HashM
import java.util.M
import javax.servlet.F
import javax.servlet.FilterC
import javax.servlet.FilterC
import javax.servlet.ServletE
import javax.servlet.ServletR
import javax.servlet.ServletR
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpServletRequestW
import javax.servlet.http.HttpServletR
public class CharacterEncodingFilter2 implements Filter {
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)
HttpServletResponse response = (HttpServletResponse)
//解决post中文乱码问题
request.setCharacterEncoding(&UTF-8&);
response.setCharacterEncoding(&UTF-8&);
response.setContentType(&text/charset=UTF-8&);
//解决get中文乱码问题
MyRequest myrequest = new MyRequest(request); &//自己定义一个request
chain.doFilter(myrequest, response); & //servlet &myrequest.getParameter(&username&)
//继承HttpServletRequestWrapper ://sun公司提供的包装类
//自定义request,解决get中文乱码问题
class MyRequest extends &HttpServletRequestWrapper{ &//request
private HttpServletR
public MyRequest(HttpServletRequest request){
super(request);
this.request =
//重构方法
public String getParameter(String name) {
String value = this.request.getParameter(name); &//获取用户提交的数据 get &乱码
if(value==null){
//判断是否是get请求方式
if(!request.getMethod().equals(&GET&)){
value = new String(value.getBytes(&iso8859-1&),this.request.getCharacterEncoding());
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
//重构方法
public Map getParameterMap() {
if(!this.request.getMethod().equals(&GET&)){//判断是否是get请求方式,不是get请求则直接返回
return this.request.getParameterMap();
Map&String,String[]& map = this.request.getParameterMap(); &//接受客户端的数据
Map&String,String[]& newmap = new HashMap(); &&
for(Map.Entry&String, String[]& entry : map.entrySet()){
String name = entry.getKey();
String values[] = entry.getValue();
if(values==null){
newmap.put(name, new String[]{});
String newvalues[] = new String[values.length];
for(int i=0; i&values.i&#43;&#43;){
String value = values[i];
value = new String(value.getBytes(&iso8859-1&),this.request.getCharacterEncoding());
newvalues[i] = //解决乱码后封装到Map中
newmap.put(name, newvalues);
}catch (Exception e) {
throw new RuntimeException(e);
public String[] getParameterValues(String name) {
// TODO Auto-generated method stub
return super.getParameterValues(name);
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
public void destroy() {
// TODO Auto-generated method stub
转载地址:
http://blog.csdn.net/furongkang/article/details/6761099
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:275681次
积分:3420
积分:3420
排名:第4625名
原创:79篇
转载:111篇
评论:58条
(1)(2)(11)(3)(7)(3)(4)(4)(3)(3)(2)(3)(5)(1)(1)(5)(10)(1)(9)(1)(7)(6)(6)(4)(3)(2)(2)(3)(3)(1)(4)(2)(1)(3)(1)(2)(2)(6)(5)(12)(7)(3)(1)(12)(14)}

我要回帖

更多关于 get 提交request乱码 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信