`
01404421
  • 浏览: 226785 次
  • 性别: Icon_minigender_1
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

查询分页中汉字参数传递的编码问题解决方案

阅读更多

首先,感谢我昨天的提问http://www.iteye.com/problems/27665有那么多热心的同志回答!是他们提供的资料帮我解决了这个问题。一下开始我的正文:

昨天要做一个查询分页,因为以前没有做过中文的查询,这次确实费了一番功夫才解决,一下记录整个过程希望能帮助和我遇到同样问题的朋友们。

我的需求是如下图所示的一个酒店搜索:



项目中使用的是Spring的org.springframework.web.filter.CharacterEncodingFilter做的字符过滤器,页面和数据库都使用的是utf-8的编码,tomcat默认编码是iso-8859-1没有改动。

第一步:当这个查询的表单提交的时候Action 中第一次查询,JSP页面显示数据列表和分页,一切正常,分页的按钮链接中包含了查询条件,当然包含了汉字。但是点下一页的时候Action中读到的参数就是乱码了。这是大家都能做到的一步,往下可能很多入门者就会搞乱了。

第二步:

大家都知道Tomcat默认是不支持汉字uri的,所以我们要把传到页面的uri进行处理,网上很多介绍的,就是使用JS来处理,这里涉及到JS三个方法的escape、encodeURI、encodeURIComponent,务必理解这三个方法,这个地方有介绍:http://blog.csdn.net/sfdev/archive/2009/01/20/3842857.aspx,我用到的是encodeURI。

我处理分页链接中的汉字方法如下:

1.把分页的页面、上下页这些链接包含在一个div中

 

<div id="pageDivShow">
	<jsp:include page="/manage/util/pagination.jsp"><%--一些参数传递--%></jsp:include>
  </div>

 

 2.使用Js修改这个div中的uri,我使用的是Jquery来做的,代码如下:

 

$(document).ready(function(){
			
			$("#pageDivShow a").each(
				function(){
					var h=$(this).attr("href");
					$(this).attr({href:encodeURI(h)});
				}
			);
			
		});

 

 到此页面部分工作告一段落,我看资料里介绍JS的encodeURI方法是默认转换为utf-8,它也没有传入编码的方法。

第三步:

在Action中获取第一次Form提交的数据时可以直接获得正确的汉字,但是从分页上提交到Action中的数据要做另外一步的处理:

 

new String(value.getBytes("iso-8859-1"),"utf-8");

 

 通过这个方法就可以正确的获得分页传回的汉字参数了。

这里就又产生了一个新的问题,就是我们要区分提交给Action的请求来源是Form提交的,还是分页中提交的,这样就简单了,用一个变量就可以解决。

到此结束,很简单吧,如果还不能理解就照着做个demo,有问题欢迎交流!

再次感谢昨天热心回答我提问的同志们!

  • 大小: 36.6 KB
0
0
分享到:
评论
5 楼 snowolf 2009-10-24  
01404421 写道
snowolf 写道
snowolf 写道
跳出你的字符集编码转换,用Base64编码吧!

参考使用Url Base64编码,这是最常用的方式!

多谢啊,以前还没有接触过Based64,刚才看了一下,还不是很了解,如果能给一些资料就更感激了!

我博客里有http://snowolf.iteye.com/blog/379860你可以先了解一下,具体的url base64实现可以看commmons codec 的1.4版本实现! 使用起来很简单!!!
4 楼 01404421 2009-10-24  
snowolf 写道
snowolf 写道
跳出你的字符集编码转换,用Base64编码吧!

参考使用Url Base64编码,这是最常用的方式!

多谢啊,以前还没有接触过Based64,刚才看了一下,还不是很了解,如果能给一些资料就更感激了!
3 楼 snowolf 2009-10-24  
snowolf 写道
跳出你的字符集编码转换,用Base64编码吧!

参考使用Url Base64编码,这是最常用的方式!
2 楼 snowolf 2009-10-24  
跳出你的字符集编码转换,用Base64编码吧!
1 楼 01404421 2009-10-24  
刚在百度搜索结果的代码里导入的JS文件中发现这样一句代码:
C.src = "http://suggestion.baidu.com/su?wd=" + encodeURIComponent(S) + "&p=" + R + "&t=" + (new Date()).getTime();

原来百度也是使用JS来解决编码问题的,用的是encodeURIComponent这个方法,查了一下JS的三个方法的区别:
escape() 方法:采用ISO Latin字符集对指定的字符串进行编码。所有的空格符、标点符号、特殊字符以及其他非ASCII字符都将被转化成%xx格式的字符编码(xx等于该字符在字符集表里面的编码的16进制数字)。比如,空格符对应的编码是%20。unescape方法与此相反。不会被此方法编码的字符: @ * / +

encodeURI() 方法:把URI字符串采用UTF-8编码格式转化成escape格式的字符串。不会被此方法编码的字符:! @ # $& * ( ) = : / ; ? + '

encodeURIComponent() 方法:把URI字符串采用UTF-8编码格式转化成escape格式的字符串。与encodeURI()相比,这个方法将对更多的字符进行编码,比如 / 等字符。所以如果字符串里面包含了URI的几个部分的话,不能用这个方法来进行编码,否则 / 字符被编码之后URL将显示错误。不会被此方法编码的字符:! * ( )

因此,对于中文字符串来说,如果不希望把字符串编码格式转化成UTF-8格式的(比如原页面和目标页面的charset是一致的时候),只需要使用escape。如果你的页面是GB2312或者其他的编码,而接受参数的页面是UTF-8编码的,就要采用encodeURI或者encodeURIComponent。

相关推荐

    ASP.NET常见问题集锦.zip

    .net中中文乱码问题解决.txt ADO.NET 与 XML:双剑合壁,威力强大.doc ASP.NET HTTP 运行时.doc ASP.NET ViewState 初探.doc ASP.NET Web 方法中的 XmlElement 参数的功能.d ASP.NET 中 Cookie 的基本知识....

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例102 解析URL地址中传递的编码参数 134 实例103 转义帖子中的特殊字符 135 实例104 获取任意字符的ASCII码 136 实例105 查找指定ASCII码对应的字符 136 实例106 合理定义上传文件的名称 137 实例107 通过异或方式...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例102 解析URL地址中传递的编码参数 134 实例103 转义帖子中的特殊字符 135 实例104 获取任意字符的ASCII码 136 实例105 查找指定ASCII码对应的字符 136 实例106 合理定义上传文件的名称 137 实例107 通过异或方式...

    PHP程序开发范例宝典III

    让你短时间内由一名菜鸟到高手绝对没问题! 由于权限有限,分3部份下载 PHP程序开发范例宝典 内容提要 《PHP程序开发范例宝典》全面介绍了应用PHP进行网站开发的各种技术和技巧。《PHP程序开发范例宝典》分为20章...

    java面试宝典

    199、在ORACLE大数据量下的分页解决方法。一般用截取ID方法,还有是三层嵌套方法。 47 200、xml有哪些解析技术?区别是什么? 48 201、你在项目中用到了xml技术的哪些方面?如何实现的? 48 202、用jdom解析xml文件时...

    千方百计笔试题大全

    199、在ORACLE大数据量下的分页解决方法。一般用截取ID方法,还有是三层嵌套方法。 47 200、xml有哪些解析技术?区别是什么? 48 201、你在项目中用到了xml技术的哪些方面?如何实现的? 48 202、用jdom解析xml文件时...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    每个实例都是经过笔者精心筛选的,具有很强的实用性,其中一些实例是开发人员难于寻觅的解决方案。 本书两卷共计1200个例子,包括了开发中各个方面最常用的实例,是目前市场上实例最全面的开发类图书;本书实例来源...

    Java面试宝典2010版

    26、大数据量下的分页解决方法。 27、用 JDBC 查询学生成绩单, 把主要代码写出来(考试概率极大). 28、这段代码有什么不足之处? 29、说出数据连接池的工作机制是什么? 30、为什么要用 ORM? 和 JDBC 有何不一样?...

    java面试题

    并发问题解决方案 59 71.7. Hibernate是如何延迟加载? 60 71.8. Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系) 60 71.9. 说下Hibernate的缓存机制 60 71.10. Hibernate的查询方式 60 71.11. 如何...

    最新Java面试宝典pdf版

    26、大数据量下的分页解决方法。 111 27、用 JDBC 查询学生成绩单, 把主要代码写出来(考试概率极大). 112 28、这段代码有什么不足之处? 112 29、说出数据连接池的工作机制是什么? 113 30、为什么要用 ORM? 和 JDBC...

    Java面试笔试资料大全

    26、大数据量下的分页解决方法。 111 27、用 JDBC 查询学生成绩单, 把主要代码写出来(考试概率极大). 112 28、这段代码有什么不足之处? 112 29、说出数据连接池的工作机制是什么? 113 30、为什么要用 ORM? 和 JDBC...

    C#编程经验技巧宝典

    2 &lt;br&gt;0003 设置程序代码行序号 3 &lt;br&gt;0004 开发环境全屏显示 3 &lt;br&gt;0005 设置窗口的自动隐藏功能 3 &lt;br&gt;0006 根据需要创建所需解决方案 4 &lt;br&gt;0007 如何使用“验证的目标架构”功能 4 ...

    JAVA面试宝典2010

    26、大数据量下的分页解决方法。 111 27、用 JDBC 查询学生成绩单, 把主要代码写出来(考试概率极大). 112 28、这段代码有什么不足之处? 112 29、说出数据连接池的工作机制是什么? 113 30、为什么要用 ORM? 和 JDBC...

    Java面试宝典-经典

    26、大数据量下的分页解决方法。 111 27、用 JDBC 查询学生成绩单, 把主要代码写出来(考试概率极大). 112 28、这段代码有什么不足之处? 112 29、说出数据连接池的工作机制是什么? 113 30、为什么要用 ORM? 和 ...

Global site tag (gtag.js) - Google Analytics