处理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编码,再到后台进行解码:
页面部分:
<script type="text/javascript">
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,’’,’’);
}
</script>
后台部分:(解码)
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页面:
<%@ page language="java" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<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)
}
</script>
<title>待办工作查看</title>
</head>
<body>
<!-- 部分代码略 -->
<table border="1" align="center">
<tr>
<td>
<a href="#" onclick="javascript:showork('leavesp?work=部门主管审批')">查看待办工作</a>
</td>
</tr>
</table>
</body>
</html>
页面部分就一个超连接,用来开启一个网页对话框,只是开启的这个对话框中请求的不是一个物理的页面,而是请求的一个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<String> 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<values.length;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);
}
/**
* 销毁方法
*/
public void destroy()
{
}
}
过滤器部分,可用来处理页面提交的post和get方法产生的中文乱码问题。
Post方式提交的数据(form表单中提交的数据)只需要进行请求字符编码设置request.setCharacterEncoding("UTF-8");和响应设置response.setContentType("text/html;charset=UTF-8");设置就可以了。
Get方式提交的数据会包含在url中,(如:leavesp?work=部门主管审批),则需要取出参数名:Enumeration<String> paramNames = request.getParameterNames();(如:work)和取出参数值:String values[] = request.getParameterValues(name);(如:部门主管审批),然后再将参数值进行编码转换:outStr = new String(inStr.getBytes("iso-8859-1"),"UTF-8");
过滤器写好这后就需要到web.xml中<web-app>与</web-app>之间进行配置了,web.xml中配置如下:
<!-- 配置过滤器 -->
<filter>
<description>处理中文乱码过滤器</description>
<filter-name>ProFilter</filter-name>
<filter-class> com.util.filters.ProFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ProFilter</filter-name>
<url-pattern>*</url-pattern><!-- 过滤所有请求,注:tomcat5请用/* -->
</filter-mapping>
这样配置之后只要页面有任何请求都会通过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>*</url-pattern>所以所有请求将会通过过滤器进行处理,此过滤器处理过程如下:
2.1获得参数名集合:
Enumeration<String> 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=” 部门主管审批”。
看到这里,你应该也已经会处理中文乱码问题了。赶紧试试!!^_^
简而言之,JavaWeb中页面乱码问题采用过滤器过滤,问题一般都能解决。
处理URL传递中文乱码问题的更多相关文章
- JS中文转换(UTF-8),url传递中文乱码解决
来源于:http://blog.csdn.net/kuangfengbuyi/article/details/45557437 js合成url时,如果参数是中文,传到struts2中会乱码,解决办法如 ...
- URL传递中文乱码的问题
在AJAX浏览器来进行发送数据时,一般它所默认的都是UTF-8的编码. 使用JQUERY中所提供的方法来做操作 encodeURI function verify() { //解决中文乱麻问题的 ...
- .NET在IE9中页面间URL传递中文变成乱码的解决办法
在.Net的项目中,鼠标点击查询按钮,转到查询页面,但URL中包含中文时,传到服务器端后,中文变成了乱码(只有IE9出现该问题). 尝试使用Server.UrlEncode()进行编码, ...
- Java中url传递中文参数取值乱码的解决方法
java中URL参数中有中文值,传到服务端,在用request.getParameter()方法,得到的常常会是乱码,这将涉及到字符解码操作. 方法一: http://xxx.do?ptname=’我 ...
- 通过URL传递中文参数的乱码处理
环境:web.xml中配置了 <filter> <filter-name>encodingFilter</filter-name> <filter-class ...
- url 传递中文参数乱码问题的终极解决方法。
估计很多人在做web开发的时候,都会碰到过url传递中文参数,有时候会出现乱码的问题,但有些项目或者环境,又不会有问题.当遇到乱码的时候,上网找了很多解决方案,比如: 页面设置它的编码方式,改成utf ...
- jquery.ajax的url中传递中文乱码问题的解决方法
jquery.ajax的url中传递中文乱码问题的解决方法 JQuery JQuery默认的contentType:application/x-www-form-urlencoded 这才是JQu ...
- 解决get方法传递URL参数中文乱码问题
[转]解决get方法传递URL参数中文乱码问题 来自:http://www.javaeye.com/topic/483158 应用一:解决tomcat下中文乱码问题(先来个简单的) 在tomcat下, ...
- URL传递中文参数,大坑一枚,Windows与Linux效果竟然不一致(两种解决方法)
下午,计划2个小时搞定,个人官网第6次升级,就可以干点轻松的事了,结果,下午多搞了2个小时,晚上又搞了2个小时,才搞定. 最后一个世界难题是,URL传递中文参数. 问题大致是这么出现的:我为" ...
随机推荐
- 帝国cms的list.var中使用php函数
$r[title] = esub($r[title],8,'...'); //截取前8个字符,多出部分用...代替 $r[title] = str_replace("lhj",&q ...
- js省市二级联动
html: <script src="js/city.js"></script> ...... <body> <div class=&qu ...
- ubuntu server install 安装中文(搜狗)输入法
1.对于ubuntu server默认无中文输入法框架,我比较倾向于我一直使用的ibus-sunpinyin.这里我需要先安装ibus的框架 不过我遇到了问题: dpkg: dependency pr ...
- (转)Linux开启mysql远程连接的设置步骤
Mysql默认root用户只能本地访问,不能远程连接管理mysql数据库,Linux如何开启mysql远程连接?设置步骤如下: 1.GRANT命令创建远程连接mysql授权用户itlogger mys ...
- mysqldump进行数据库的全备时,备份数据库的顺序是什么,就是先备份哪个库,然后再备份哪个库
需求描述: 今天在用mysqldump工具进行数据库的备份的时候,突然想了一个问题,比如我有10个库要进行备份 那么是先备份哪个,然后再备份哪个呢,所以,做了实验,验证下. 操作过程: 1.使用--a ...
- linux中,通过crontab -e编辑生成的定时任务,写在哪个文件中
环境描述: 操作系统:Red Hat Enterprise Linux Server release 6.6 (Santiago) 内核版本:2.6.32-504.el6.x86_64 需求描述: 一 ...
- Spring Framework 官方文档学习(四)之Validation、Data Binding、Type Conversion(一)
题外话:本篇是对之前那篇的重排版.并拆分成两篇,免得没了看的兴趣. 前言 在Spring Framework官方文档中,这三者是放到一起讲的,但没有解释为什么放到一起.大概是默认了读者都是有相关经验的 ...
- PHP代码审计 -1.SQL注入总结
0x01 背景 最近在学习PHP代码审计,这里做一个SQL注入总结,是对自己学习知识的总结,也是为自己学习的笔记,方便自己反复翻阅. 0x02 PHP代码审计-SQL注入 挖掘SQL ...
- docker 配置文件:/etc/docker/daemon.json
/etc/docker/daemon.json 是 docker 的配置文件,默认是没有的,需要我们手动创建,可配置项如下: [root@localhost ~]$ vim /etc/docker/d ...
- Python 收集主机信息
写一个 python 脚本,收集以下信息 ( CentOS 6 ) : IP地址 <ip> 主机名 <hostname> 操作系统版本 <osver> ...