- 浏览: 967543 次
文章分类
最新评论
-
18335864773:
很多公司项目 都在使用pageoffice 来操作word,e ...
用java生成word文档 -
Gozs_cs_dn:
请问下博主, 怎样将sitemesh3.xsd绑定 sitem ...
SiteMesh3配置 -
Rose_06:
springside4.0quick-start.bat报错原因 -
ilemma:
我也是刚参见工作啊,经理让自学这个,有些东西不太懂,能不能发个 ...
Apache Shiro在Web中的应用 -
shanbangyou:
你废了
程序员上班打酱油的方法
JSP中文传参数乱码问题。
如果是post加过滤器或者加入
request.setCharacterEncode("gbk")(管输入)
response.setCharacterEncode("gbk")(管输出)
如果是url的get提交参数带中文的
可以改下面这个文件,加入一个URIEncoding="GBK"
X:\Tomcat \conf\Server.xml
- <Connector
- port="8080"
- redirectPort="8443"
- minSpareThreads="25"
- connectionTimeout="30"
- maxThreads="150"
- maxSpareThreads="75"
- URIEncoding="GBK">
一、概况:ie7正常,ie6参数就会出现中文接受信息错误,表现为长度是奇数时最后一个字符出现乱码。
二、具体表现:
1、全是汉字时,无论奇数还是偶数,都无乱码。
2、如果是英文中文混合,并且英文字符数是奇数时,就会出现最后有一个“?”号。
3、如果是英文中文混合,并且英文字符数是偶数时,无乱码。
三、原因:ie7支持UTF8编码,但是ie6支持不好。
环境: jdk1.5,tomcat5.5,ie6.0 ,所有jsp页面,xml配置文件URIEncoding 都设置成utf-8,也保存成utf-8格式。
当用ie提交时,单个汉字会出现这个问题。(如果所有的都设置成gbk,则不会出现此问题)
开始以为是tomcat源码问题,通过跟踪tomcat,调试 tomcat org.apache.coyote.http11.Http11BaseProtocol.java可知:
如果输入单汉字“你”->tomcat的侦听的byte流应该时:%E4%BD%A0,而实际收到的是 %E4%BD,第3个byte没有收到。
而同样的配置,如果用firefox1.5测试,则完全正常。!!!!!
所以,这个是ie发送信息时转码错误!!
四、解决方法:
1、用post发送,这个方法当然不出错了,但是,有时候必须用get传递参数的方法,那就没辙了,只能用第二个方法。
2、习惯把中文字符串显示长度设置为偶数。
现在的处理逻辑是:在业务方法里进行判断,如果输入的字符个数为奇数,则给其拼接上一个全角的空格,如果是半角的空格,也还是会有乱码问题。
当你要传值时,故意在汉字结尾处加一个半角字符,比如:
index.jsp?name=我爱你_
我要传的是“我爱你”,但是我故意加一个“_”在后面。
然后在servlet里接收时,用substring()去掉这个“_”:
String name = request.getParameter("name");
name = name.substring(0, name.length()-1);
在网页中的超链接,例如 <a href="/servlet?id=1&name=世界">click me</a>,如果超链接里的地址有中文就如上面的'name=世界'一样,即使在web.xml中设置转换字符集的filter,在servlet中得到的值还是乱码。下面是我的几个实验,
(1) 首先,在web.xml中没有字符集转换的filter下,在表单中提交中文的情况,HTML片段如下
- <form action="./servlet/MyServlet" method="get">
- <input type="text" name="name">
- <input type="submit">
- </form>
<form action="./servlet/MyServlet" method="get"> <input type="text" name="name"> <input type="submit"> </form>
在文本框中输入'世界', 毫无疑问这个时候在servlet中得到的name的值是乱码 例如:name = ????
(2)现在再把form中的method方法换成post并且仍然是在web.xml中没有字符集转换的filter下,看在表单中提交中文会不会有乱码,HTML片段如下
- <form action="./servlet/MyServlet" method="post">
- <input type="text" name="name">
- <input type="submit">
- </form>
<form action="./servlet/MyServlet" method="post"> <input type="text" name="name"> <input type="submit"> </form>
在文本框中输入'世界', 这个时候在servlet中得到的name的值仍然是乱码 例如:name = ????
(3)现在在web.xml中加入字符集转换的filter,代码如下
- <filter>
- <filter-name>Set Character Encoding</filter-name>
- <filter-class>filters.SetCharacterEncodingFilter</filter-class>
- <init-param>
- <param-name>encoding</param-name>
- <param-value>GBK</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>Set Character Encoding</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
<filter> <filter-name>Set Character Encoding</filter-name> <filter-class>filters.SetCharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>GBK</param-value> </init-param> </filter> <filter-mapping> <filter-name>Set Character Encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
(4)现在咱们还是现在form的method属性是get时候进行测试,在文本框中输入世界,然后在servlet中得到的name值仍然是乱码,name = ????
(5)然后再在form的method属性是post时候进行测试,在文本框中输入世界,然后在servlet中得到的name值就是正常的值的没有乱码。
我现在用的浏览器是IE,就是表单提交中文时候,如果正确的设置了字符集转换的filter,那么在form中的post方法中提交时,在servlet中得到的正常的值,如果在form中的get方法中提交时候,得到的中文数据居然是乱码,这个有点不可思议。
(6)然后在同样的环境下,在超链接的href属性中提交中文参数值,例如
<a href='./servlet/MyServlet?name=世界>click me</a> <br>
在servlet中得到的是乱码。在这种情况下在servlet中进行转码。例如,
- try {
- name = new String(name.getBytes("ISO-8859-1"), "gbk");
- } catch(Exception e) {
- e.printStackTrace();
- }
try { name = new String(name.getBytes("ISO-8859-1"), "gbk"); } catch(Exception e) { e.printStackTrace(); }
或者
java.net.URLDecoder.decode(name) 通过这个语句进行转码也是可以得到正常值的。
(7)同样是在有字符集转换的filter下,在JSP中使用JSTL的 <c:url>标签是否可以避免乱码吗,使用如下的标签
- <c:url value="./servlet/MyServlet" var="url">
- <c:param name="name" value="${'世界'}" />
- </c:url>
- <a href="${url}">Hello</a> <br>
<c:url value="./servlet/MyServlet" var="url"> <c:param name="name" value="${'世界'}" /> </c:url> <a href="${url}">Hello</a> <br>
然后在servlet中得到的仍然是乱码,仍然需要(6)中介绍的方法进行转换,才能得到正确的值。
(8)通过post方法提交的表单中的中文值是不需要通过(6)中的进行转码的,如果进行转码的话,反而会造成乱码。那么,在serlvet中,如果让这两种提交方式(超链接提交和表单post方法)都通用的话,如果超链接的值没有中文的话是可以实现通用的,如果超链接提交的参数有中文的话,就会出现问题,那么就必须在超链接提交的URL中另加一个额外的参数来标识是从哪里提交的,以此来决定是否需要对特定的值进行转化。有没有更好的办法在超链接里提交中文时候在servlet中不进行转码呢。答案就是(5)。如果把超链接提交转化为表单的post提交,中文就不会出现乱码,见(9)
(9)
- function linkClick(linkObject) {
- var formObject = document.createElement('form');
- document.body.appendChild(formObject);
- formObject.setAttribute('method', 'post');
- var url = linkObject.href;
- var uri = '';
- var i = url.indexOf('?');
- if(i == -1) {
- formObject.action = url;
- } else {
- formObject.action = url.substring(0, i);
- }
- if( i >= 0 && url.length >= i + 1) {
- uri = url.substring(i + 1, url.length);
- }
- var sa = uri.split('&');
- for(var i = 0; i < sa.length; i++) {
- var isa = sa[i].split('=');
- var inputObject = document.createElement('input');
- inputObject.setAttribute('type', 'hidden');
- inputObject.setAttribute('name', isa[0]);
- inputObject.setAttribute('value', isa[1]);
- formObject.appendChild(inputObject);
- }
- formObject.submit();
- return false;
- }
function linkClick(linkObject) { var formObject = document.createElement('form'); document.body.appendChild(formObject); formObject.setAttribute('method', 'post'); var url = linkObject.href; var uri = ''; var i = url.indexOf('?'); if(i == -1) { formObject.action = url; } else { formObject.action = url.substring(0, i); } if( i >= 0 && url.length >= i + 1) { uri = url.substring(i + 1, url.length); } var sa = uri.split('&'); for(var i = 0; i < sa.length; i++) { var isa = sa[i].split('='); var inputObject = document.createElement('input'); inputObject.setAttribute('type', 'hidden'); inputObject.setAttribute('name', isa[0]); inputObject.setAttribute('value', isa[1]); formObject.appendChild(inputObject); } formObject.submit(); return false; }
下面是html代码
- <a href='./servlet/MyServlet?name=世界&id=1' onclick="return linkClick(this)">click me</a> <br>
<a href='./servlet/MyServlet?name=世界&id=1' onclick="return linkClick(this)">click me</a> <br>
这样就OK了,在linkClick方法里面会自己创建一个表单,然后会去解析你的参数并自动转化成hidden,并给hidden域赋值,这样,再也不怕提交中文参数,并且也不需要在servlet中进行麻烦的转码,真是一劳永逸啊,但是需要在JSP的超链接中加上上面的方法。上面的程序用的是IE6和tomcat5。
2.
请求参数,需要编码
<a href="newsAction?name=<%=java.net.URLEncoder.encode("表数据管理","UTF-8")%>"
target="frameset">Xls表数据管理 </a>
假如是java代码的话直接写java.net.URLEncoder.encode("测试吗","UTF-8");
下面引用Qieqie的一段代码:
public static void main(String[] args) throws UnsupportedEncodingException { //给定某3个汉字 String src = "你好啊"; //String src = "一二三"; //浏览器进行utf-8编码,并传送到服务器 byte[] bytes1 = src.getBytes("utf-8"); System.out.println(bytes1.length);//9 //tomcat以gbk方式解码(这个片段的说明仅针对gbk处理汉字的情况) //如果一对汉字字节不符合gbk编码规范,则每个字节使用'?'(ascii 63)代替 //万幸的话,只是最后一个(第9个)字节因不能成对,变成问号(比如当src="你好啊"时) //不幸的话,中间某些字节就通不过gbk编码规范出现'?'了(比如当src="一二三"时) //总之temp的最后一位必定是问号'?' String temp = new String(bytes1, "gbk"); //你的action中的代码 //由于以上的tomcat以gbk解释utf-8不能成功 //所以此时bytes2和bytes1不一样 byte[] bytes2 = temp.getBytes("gbk"); System.out.println(bytes2.length); for (int i = 0; i < bytes1.length; i++) { System.out.print(bytes1[i] & 0xff); System.out.print("\t"); } System.out.println(); for (int i = 0; i < bytes2.length; i++) { System.out.print(bytes2[i] & 0xff); System.out.print("\t"); } System.out.println(); //构建出来的dest自然不是原先的src String dest = new String(bytes2, "utf-8"); System.out.println(dest); }
发表评论
-
代写java程序qq:928900200
2014-06-18 12:46 3学校为全面提升学校教学质量,提高管理水平,决定开发一套小型成 ... -
销售管理需求分析
2013-07-03 08:18 4601. 概述 目前,销售管理在企业管理中 ... -
基于jsp+servlet+jdbc的销售管理
2013-07-02 16:32 7源码http://apenny.taobao.com 1 ... -
基于jsp邮件收发系统用javamail包
2012-11-29 15:32 564基于jsp邮件收发系统用javamail包 ... -
jsp连接h2例子
2012-05-10 20:30 1095一、通过server形式连接 1.将h2.jar复制到web ... -
遇到get乱码前端编码要两次
2012-05-04 14:40 602<a id="t" href=&q ... -
基于Myeclipse9.1的spring3.1MVC开发搭建
2011-10-01 14:27 1991(1)配置基础装备。每个符合Java EE规范的web应用程 ... -
jsp post乱码解决
2011-05-10 09:18 14663条语句解决post乱码 输入页加: < ... -
get post乱码解决
2011-04-13 11:25 423如果是post加过滤器 如果是url的get提交参数带 ... -
jsp根据时间显示内容
2011-03-26 21:34 491<%java.util.Date dt=new java ... -
网页抓取例子
2010-08-12 15:38 754<%@ page contentType="t ... -
不允许从数据类型 ntext 到数据类型 varchar 的隐性转换
2010-04-22 09:50 2264虽然SQL Server 2000的varchar类型最大可以 ... -
session 对新开窗口无效
2009-04-14 21:50 1086出现问题: session 对 ... -
地址栏图标
2009-04-10 14:52 1825很多新手经常会问道,地址栏里域名http前面的小图标(网址前面 ... -
jsp 判断是否登录
2009-04-10 09:45 2526jsp 判断 是否登录, 每个页面判断,代码重复。 可以使 ... -
jsp response.sendRedirect 报错 加return
2009-04-05 19:14 1609ResponseFacade.sendRedirect(Res ... -
jsp url传递中文参数
2009-04-05 17:58 1596均按utf-8编码 <%@ page contentTy ... -
tomcat6配置数据源
2009-04-04 08:50 1013Tomcat 5的数据源配置跟Tomcat 5.5的数据源配置 ... -
tomcat不能访问中文名文件问题解决办法
2009-03-30 15:27 17961、把这句加到你的jsp文件最开头(这里是解决中文不能显示的问 ... -
jsp javamail发送html邮件
2009-02-25 21:36 2198<%@ page language="java ...
相关推荐
修改Tomcat默认编码消除get方式传递参数出现中文乱码修改Tomcat默认编码消除get方式传递参数出现中文乱码修改Tomcat默认编码消除get方式传递参数出现中文乱码修改Tomcat默认编码消除get方式传递参数出现中文乱码
PHP接收GET中文参数乱码深入研究.
JSP-GET-POST传递的乱码问题 中文参数传递乱码问题一直伴随着我们,整理的解决过程。
本资源参考网上原版为存取英文字符的ini操作,未考虑中文乱码问题。而网上另外也有资料如何处理中文编码,例如转码为utf-8,存能解决乱码,取又出现问题。本资源我重新整理,用unicode完美解决中文乱码问题。用法: ...
SpringMVC解决GET请求时中文乱码的问题.rar
get方式传参中文乱码问题的解决方案
java解决解决get中文乱码问题,在项目中多次使用,从未有错!
tomcat get提交中文乱码解决方案,修改tomcat server.xml 中以下为
过滤器实现get请求乱码问题 过滤器实现get请求乱码问题 过滤器实现get请求乱码问题
解决方法是在Action中添加一个成员变量,保存编码后的中文参数。在vm页面渲染时取出这个变量值,再拼接超链接。 在这里碰到的问题是:调用java.net.URLEncoder的encode()方法时,如果没有显示指定字符集参数,那么...
get请求乱码问题 java
曾经有一位朋友遇到这样一个问题,一产品名称为A&T Plastic,在产品列表中就产生了这样的一个联接<a>A&T Plastic,在服务器端接收此参数的时候怎么也无法接收到准确的产品名。 当时就问我,如何解决,也许是当时忙吧...
使用过滤器实现GET请求和POST请求的中文乱码问题,只需在自己的Web应用中的web.xml中配置该filter即可使用。
JSP中 ajax的get请求的中文乱码问题的解决方法.pdf 学习资料 复习资料 教学资源
主要是修改两个问题:一个问题是请求接口中文乱码的问题 第二个问题是,有时候,对方接口参数比较奇怪,而我们的request类的属性又不能用那种名字,就需要指定别名。比如当当的开放平台 出版物类 的添加,某个参数的...
IE 浏览器在get请求下中文乱码的问题
下载这个工具类,然后直接调用createHtmlPage方法就可以了。最关键一点是,网上的方法没有一个解决了乱码问题,费了我不少功夫。
本Demo主要针对jquery的$.getJSON操作,返回json, 针对传参出现的中文乱码, json里出现中文乱码。
参看文档:http://blog.csdn.net/sinat_29398599/article/details/52880036
关于java中使用表单get方法传值出现乱码问题的解答。详细简单,便于学习使用。