处理URL传递中文乱码问题 |
您所在的位置:网站首页 › 头盔z7和z8哪个性价比更高一点 › 处理URL传递中文乱码问题 |
在网上搜了很多资料都没有搞定 , 一般都有以下几种说法 : 方法 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 页面:
< html > < head > < script type = "text/javascript" > // 开启网页对话脚本 function openDialog(url,width,height) { var property= "status:no;center:yes;resizable:yes;scroll:yes;dialogWidth:" +width+ "px;dialogHeight:" +height+ "px;" ; var ret=window.showModalDialog(url, 'modalDialogwin' ,property);
if (ret == null || ret == "" ) {return false ; } return true ; }
// 查看待办工作脚本 function showork(url) { // 将 url 地址进行编码 url=encodeURI(url); //alert(url); // 调用 openDialog 方法开启网页对话框 openDialog(url,900,500) }
< title > 待办工作查看
< body >
< table border = "1" align = "center" > < tr > < td > < a href = "#" onclick = "javascript:showork('leavesp?work= 部门主管审批 ') "> 查看待办工作
页面部分就一个超连接,用来开启一个网页对话框,只是开启的这个对话框中请求的不是一个物理的页面,而是请求的一个 servlet ( leavesp ),而且 url 中带有中文参数值( ?work= 部门主管审批 )。
为了处理中文乱码部分能够在整个 WEB 系统中都能够使用到,所以将中文乱码处理写成了一个 Filter( 过滤器 ) ,并在 web.xml 中配置所有的请求都将经过这个 Filter 进行过滤。 Filter 部分的代码如下: 文件名: ProFilter.java package com.util.filters;
import java.io.IOException; import java .io.UnsupportedEncodingException; import java.util.Enumeration;
import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;
public class ProFilter implements Filter {
protected FilterConfig filterConfig ; /** * 初始化 */ public void init(FilterConfig filterConfig) throws ServletException { this . filterConfig =filterConfig; }
/** * 将 inStr 转为 UTF - 8 的编码形式 * @param inStr 输入字符串 * @return UTF - 8 的编码形式的字符串 * @throws UnsupportedEncodingException */ private String toUTF(String inStr) throws UnsupportedEncodingException { String outStr = "" ; if (inStr != null ) { //outStr=java.net.URLDecoder.decode(inStr);// 不用 decode 了 , 到这的时候就已经自动 decode 过了 // 将字符串转为 UTF-8 编码形式 outStr = new String(inStr.getBytes( "iso-8859-1" ), "UTF-8" ); } return outStr; }
/** * 中文乱码过滤处理 */ public void doFilter(ServletRequest svlrequest, ServletResponse svlresponse, FilterChain chain) throws IOException, 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 ( int i=0;i 与 之间进行配置了, web.xml 中配置如下: < filter > < description > 处理中文乱码过滤器 < filter-name > ProFilter < filter-class > com.util.filters.ProFilter
< filter-mapping > < filter-name > ProFilter < url-pattern > *
这样配置之后只要页面有任何请求都会通过 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 过滤器配置为 < url-pattern > * 所以所有请求将会通过过滤器进行处理,此过滤器处理过程如下: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 = new String(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=” 部门主管审批 ” 。
看到这里,你应该也已经会处理中文乱码问题了。赶紧试试!! ^_^
这是我个人处理中文乱码的经验,我将它拿来分享与各位,如果中间有写得不对的地方还请各位帮忙指正。谢谢 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |