作者:肖文伟

在网上搜了很多资料都没有搞定,一般都有以下几种说法:

方法1:在后台中先获得字符串的iso-8859-1编码形式数组,再使用此数组实例一个UTF-8编码形式String类型字符串.

页面提交的url为:

leavesp?work=部门主管审批

后台处理:

String inStr=request.getParameter("work ");

String outStr = new String(inStr.getBytes("iso-8859-1"),"UTF-8");

方法2:在页面传递过来时先通过JavaScript将URL编码,再到后台进行解码:

页面部分:

function dogetMethod(url)

{

//url编码前: leavesp?work=部门主管审批

url=encodeURI(url);

//url编码后:

leavesp?work=%E9%83%A8%E9%97%A8%E4%B8%BB%E7%AE%A1%E5%AE%A1%E6%89%B9

window.open(uri,’’,’’);

}

后台部分:(解码)

String inStr= request.getParameter("work ");

String outStr=java.net.URLDecoder.decode(inStr);

尝试过两种方法后好像都不行,在后台获取到的字符还是会乱码.试完之后真想哭.*o*

使用第一种方法后发现:

在请求(request)中获得的字符串是这样的:²¿ÃÅÖ÷¹ÜÉóÅú

使用new String(inStr.getBytes("iso-8859-1"),"UTF-8");处理后字符成了: ����������

没法,只能再试第二种方法了,使用后发现:

在页面中使用encodeURI(url)后,字符串是这样的:

%E9%83%A8%E9%97%A8%E4%B8%BB%E7%AE%A1%E5%AE%A1%E6%89%B9

好像有希望了!!!!

应该只要在后台再来decoder一下就行了吧,偶是这样想的,也是这样做的:

在后台中:

String inStr= request.getParameter("work ");

outStr=java.net.URLDecoder.decode(inStr);

在请求中获得的字符串是这样的:é¨é¨ä¸»ç®¡å®¡æ¹

decoder处理后得出的字符串为:é¨é¨ä¸»ç®¡å®¡æ¹

这时候真想哭啊!!%#$%@@!@$$##

革命尚未成功,还需努力!!!

从第二种方法中发现:

在请求中获得的字符串已经乱码了,用decoder处不处理值都是一个样!!

明明我在页面传过来的值是已经encode过了的字符,而后来取出来却….,这是为什么呢?

难倒是页面编码设置得有问题?

看了一下页面编码是: pageEncoding="UTF-8"

改了!改成: pageEncoding="iso-8859-1"试试.

浏览页面上,发现页面上的中文变成了很多éæ之类的字符,不管了,再试下,还是一样的结果.涛声依旧!

忽然想到应该是在获得字符串之前,也就是在request. getParameter("work ");这之前的某个地方已经将URL进行了decoder,并且将获得的字符用Iso-8859-1的编码方式存储过了.

所以在request中会得到这些类似于éæ之类的字符,这种字符应该就是中文的iso-8859-1的形式!!

有办法了,既然已经获得了iso-8859-1编码形式的中文,那就只要再使用第一种方法(先获得字符串的iso-8859-1数组,再将它实例成UTF-8的字符串)来进行处理不就OK了!

试过之后果然OK!!!

处理中文乱码代码实现部分:

jsp页面:

-//W3C//DTD HTML 4.01 Transitional//EN">

//开启网页对话脚本

functionopenDialog(url,width,height)

{

varproperty="status:no;center:yes;resizable:yes;scroll:yes;dialogWidth:"+width+"px;dialogHeight:"+height+"px;";

varret=window.showModalDialog(url,'modalDialogwin',property);

if(ret ==null|| ret =="")

{return false;}

return true;

}

//查看待办工作脚本

functionshowork(url)

{

//将url地址进行编码

url=encodeURI(url);

//alert(url);

//调用openDialog方法开启网页对话框

openDialog(url,900,500)

}

待办工作查看

查看待办工作

页面部分就一个超连接,用来开启一个网页对话框,只是开启的这个对话框中请求的不是一个物理的页面,而是请求的一个servlet(leavesp),而且url中带有中文参数值(?work=部门主管审批)。

为了处理中文乱码部分能够在整个WEB系统中都能够使用到,所以将中文乱码处理写成了一个Filter(过滤器),并在web.xml中配置所有的请求都将经过这个Filter进行过滤。Filter部分的代码如下:

文件名:ProFilter.java

packagecom.util.filters;

importjava.io.IOException;

importjava.io.UnsupportedEncodingException;

importjava.util.Enumeration;

importjavax.servlet.Filter;

importjavax.servlet.FilterChain;

importjavax.servlet.FilterConfig;

importjavax.servlet.ServletException;

importjavax.servlet.ServletRequest;

importjavax.servlet.ServletResponse;

importjavax.servlet.http.HttpServletRequest;

importjavax.servlet.http.HttpServletResponse;

publicclassProFilterimplementsFilter

{

protectedFilterConfigfilterConfig;

/**

*初始化

*/

publicvoidinit(FilterConfig filterConfig)throwsServletException

{

this.filterConfig=filterConfig;

}

/**

*将inStr转为UTF-8的编码形式

*@paraminStr输入字符串

*@returnUTF-8的编码形式的字符串

*@throwsUnsupportedEncodingException

*/

privateString toUTF(String inStr)throwsUnsupportedEncodingException

{

String outStr ="";

if(inStr !=null)

{

//outStr=java.net.URLDecoder.decode(inStr);//不用decode了,到这的时候就已经自动decode过了

//将字符串转为UTF-8编码形式

outStr =newString(inStr.getBytes("iso-8859-1"),"UTF-8");

}

returnoutStr;

}

/**

*中文乱码过滤处理

*/

publicvoiddoFilter(ServletRequest svlrequest, ServletResponse svlresponse,

FilterChain chain)throwsIOException, ServletException

{

//将Servlet请求与响应对象转换成HttpServlet请求与响应对象

HttpServletRequest request=(HttpServletRequest)svlrequest;

HttpServletResponse response=(HttpServletResponse)svlresponse;

//获得请求的方式(1.post or 2.get),根据不同请求方式进行不同处理

String method = request.getMethod();

//1.以post方式提交的请求,直接设置编码为UTF-8

if(method.equalsIgnoreCase("post"))

{

try

{

request.setCharacterEncoding("UTF-8");

}catch(UnsupportedEncodingException e)

{

e.printStackTrace();

}

}

//2.以get方式提交的请求

else

{

//取出客户提交的参数集

Enumeration paramNames = request.getParameterNames();

//遍历参数集取出每个参数的名称及值

while(paramNames.hasMoreElements())

{

String name = paramNames.nextElement();//取出参数名称

String values[] = request.getParameterValues(name);//根据参数名称取出其值

//如果参数值集不为空

if(values !=null)

{

//如果参数值集中只有一个值

if(values.length== 1)

{

try

{

//调用toUTF(values[0])函数,(values[0]即第一个参数值)方法转换参数值的字元编码

String vlustr=toUTF(values[0]);

//并将该值以属性的形式藏在request

request.setAttribute(name, vlustr);

}catch(UnsupportedEncodingException e)

{

e.printStackTrace();

}

}

//如果参数值集中有多个值

else

{

//遍历参数值集

for(inti=0;i

{

try

{

//回圈依次将每个值调用toUTF(values[i])方法转换参数值的字元编码

String vlustr=toUTF(values[i]);

values[i] = vlustr;

}catch(UnsupportedEncodingException e)

{

e.printStackTrace();

}

}

//将该值以属性的形式藏在request

request.setAttribute(name, values);

}

}

}

}

//设置响应方式和支持中文的字元集

response.setContentType("text/html;charset=UTF-8");

//继续执行下一个filter,无一下个filter则执行请求

chain.doFilter(request, response);

}

/**

*销毁方法

*/

publicvoiddestroy()

{

}

}

过滤器部分,可用来处理页面提交的post和get方法产生的中文乱码问题。

Post方式提交的数据(form表单中提交的数据)只需要进行请求字符编码设置request.setCharacterEncoding("UTF-8");和响应设置response.setContentType("text/html;charset=UTF-8");设置就可以了。

Get方式提交的数据会包含在url中,(如:leavesp?work=部门主管审批),则需要取出参数名:Enumeration paramNames = request.getParameterNames();(如:work)和取出参数值:String values[] = request.getParameterValues(name);(如:部门主管审批),然后再将参数值进行编码转换:outStr =newString(inStr.getBytes("iso-8859-1"),"UTF-8");

过滤器写好这后就需要到web.xml中与之间进行配置了,web.xml中配置如下:

处理中文乱码过滤器

ProFilter

com.util.filters.ProFilter

ProFilter

*

这样配置之后只要页面有任何请求都会通过ProFilter进行中文处理了,就不会再发生中文乱码问题了。

那一串通过get传递过来的中文处理过程如下:

1.在jsp页面的JavaScript里面进行编码处理:

url=encodeURI(‘leavesp?work=部门主管审批’)

编码后结果:url=leavesp?work=%E9%83%A8%E9%97%A8%E4%B8%BB%E7%AE%A1%E5%AE%A1%E6%89%B9

2.因为在web.xml过滤器配置为*所以所有请求将会通过过滤器进行处理,此过滤器处理过程如下:

2.1获得参数名集合:

Enumeration paramNames = request.getParameterNames();

String name = paramNames.nextElement();

2.1结果中有name=’work’;一值。

2.2通过参数名获得参数值:

String values[] = request.getParameterValues(name);

因work的值只有一个所以2.2的结果为:values[0]=’é¨é¨ä¸»ç®¡å®¡æ¹’;(此处得到的是字符串:“部门主管审批”的iso-8859-1编码格式字符)

2.3获得字符串的UTF-8编码格式字符:

outStr =newString(inStr.getBytes("iso-8859-1"),"UTF-8");

2.3中获得的结果为outStr=“部门主管审批”.

至此中文已经正常了。

不过过滤器还没处理结束,还得将参数名对应的值(已经处理的值)再重新藏到请求中去。

2.4将参数名对应结果藏入请求中:

request.setAttribute(name,outStr);

通过2.4处理后,请求中的work的值就变成了:部门主管审批

2.5继续执行下一个filter,无一下个filter则执行请求

chain.doFilter(request, response);

3.通过过滤器之后,就可以进入请求中对应leavesp的servlet了(servlet就不做说明了),此时在servlet中通过String work=request.getParameter(“work”);就可以获得url中传递过来的中文参数值了,结果为work=”部门主管审批”。

看到这里,你应该也已经会处理中文乱码问题了。赶紧试试!!^_^

这是我个人处理中文乱码的经验,我将它拿来分享与各位,如果中间有写得不对的地方还请各位帮忙指正。谢谢。

java url 中文乱码问题_处理URL传递中文乱码问题相关推荐

  1. java url 传值乱码问题_解决URL传递中文时出现乱码问题(三种解决方法)

    一.问题场景 一般在使用下面几种使用场景情况下,传递参数为中文时,接收得到的值都有可能乱码,具体如下: 1.直接在浏览器使用url地址访问 2.页面提交form表单时,method设置为GET 3.使 ...

  2. 彻底mysql中文乱码问题_彻底解决mysql中文乱码

    mysql是我们项目中非经常常使用的数据型数据库. 可是由于我们须要在数据库保存中文字符,所以经常遇到数据库乱码情况.以下就来介绍一下怎样彻底解决数据库中文乱码情况. 1.中文乱码 1.1.中文乱码 ...

  3. jquery 乱码 传参_jquery ajax传递中文参数乱码问题及解决方法说明

    jQuery传递中文参数乱码,原因是默认的传递方式没有采用UTF-8,所有我们可以在传递参数的时候对参数进行编码,然后再操作,代码如下,红色的代码为传递的参数,已标注 smsubmitclick = ...

  4. python传中文参数_解决Python传递中文参数的问题

    今天有个需要需要传递中文参数给URL 但是在GBK环境下的脚本传递GBK的参数老是给我报UNICODE的解码错误.烦的很. 所以我们果断选择用urlencode来处理中文, 由于国内外网站编码不同,国 ...

  5. java根据url获取pdf流_从URL获取动态创建的PDF

    我需要获取从aspx站点生成的pdf文件 . Backstory : 我想从一个网站获得schedueles,我已成功获取包含参数的scheduele的url . 如果您关注该网址,您将看到一个PDF ...

  6. 解决mysql的乱码问题_完美解决mysql中文乱码的问题

    MySQL(和PHP搭配之最佳组合)中文乱码的原因 MySQL(和PHP搭配之最佳组合)会出现中文乱码的原因不外乎下列几点: MySQL(和PHP搭配之最佳组合) server本身设定问题,例如还停留 ...

  7. android 通过图片url获取宽高_通过 URL 获取图片宽高优化

    一张小图.png 前言 客户端研发时,有时会有这样的需求,需要根据图片链接地址获取图片的宽高来进行界面排版. 一般比较正规的做法,是服务端在返回数据时将图片的信息属性一起带回来,这也符合轻客户端设计规 ...

  8. python获取url的json数据_通过url获取json数据并在python中使用(simplejson)

    我想这肯定有一个简单的答案,但我正在努力:我想获取一个url(输出json)并在python中的一个可用字典中获取数据.我被困在最后一步.>>> import urllib2 > ...

  9. mysql字符乱码百度_如何解决MySQL字符集乱码问题

    变量 @a 的字符编码是由参数 CHARACTER_SET_CLIENT 决定的,假设此时编码为 A,也就是变量 @a 的编码. 2. 写入语句在发送到 MySQL 服务端之前的编码由 CHARACT ...

最新文章

  1. VMware前路难测,多个厂家群雄逐鹿
  2. javascript eval和JSON之间的联系
  3. 笔记本电脑怎么清理灰尘_用了这么多年电脑,你该清理清理这个,将会又快又流畅...
  4. Linux - 添加PATH环境变量
  5. AJAX框架构成设计,基于Ajax的Web框架设计与实现
  6. opencv python 图像测试上采样(升采样)(cv2.pyrUp()) 下采样(cv2.pyrDown()) 池化 滑动窗口(BorderTypes)
  7. linux下写sql语言,如何写这个sql语句?
  8. python字符串后面添加字符串_什么是字符串?怎样在Python中添加字符串?
  9. samba服务器新建文件权限,Ubuntu中安装samba服务器创建文件共享的方法及普通用户设置共享的问题解析...
  10. 华为手表表盘的数字什么意思_知识 手表防水是什么意思?
  11. Ubuntu Linux下使用锐捷认证的方法
  12. 极简代码(三)—— 向量加法
  13. magento xml配置详解(1)
  14. Java网络编程(精简版)
  15. C++轻量级Json解析工具—TinyJson
  16. PMP备考之路 - 汪博士第十二章(项目采购管理)
  17. 数据库读写分离与分库分表
  18. **传统线上支付 区块链**
  19. 如何确定IP在同一网段
  20. Lighthouse 激光定位技术开源了,但不是 Valve 做的

热门文章

  1. nginx根据域名转发不同ip端口
  2. 基于arm64的万兆网驱动(82599ES)的移植与编译(ZYNQMP)
  3. Java人机猜拳思路及实现
  4. android极光静默推送,Android 推送 整合小米、个推、jpush
  5. 三元运算求三个数的最大值
  6. a7_scala三元运算
  7. 你的南理工——05年的我们相遇在这里,度过了4年
  8. 移动CRM软件是销售人员必备办公工具
  9. 计算机毕业设计之java+ssm直销模式下家具工厂自建网站
  10. vue 实现标签云效果 全码