下午,计划2个小时搞定,个人官网第6次升级,就可以干点轻松的事了,结果,下午多搞了2个小时,晚上又搞了2个小时,才搞定。

最后一个世界难题是,URL传递中文参数。

问题大致是这么出现的:我为“博客雷观” 这个栏目,增加了“全文搜索”功能,用lucene实现的。因此,需要传递中文参数。
搜索框表单提交,传递中文,很简单就搞定了。

搜索之后的分页url,需要带上当前的“搜索词” ,比如“程序员”,我在本地很轻松就搞定了。无非就是这样:
search/search.html?keyword=${keyword}"  keyword就是中文词汇,比如“程序员”。

我本以为,扔到服务器上,重启一次,就万事大吉了,结果点击第2页的时候,没有搜索到任何文章。
查看日志,发现搜索词是“乱码” 。

我第一反应是,传递的中文“程序员” 没有正确地进行url编码,所以:

<#setting url_escaping_charset='utf-8'>

<#assign  url="${base}/search/search.html?keyword=${keyword?url}"/> 
把搜索词编码之后,再附带在Url之后,但是:

Windows本地环境,ok,worked。但是,线上Linux环境,仍然不行。

围绕着是否正确了编码,在QQ、Chrome、IE上反复尝试了N次。结果,无论是否进行url编码,本地Windows的所有浏览器都能够正常地传递中文参数,线上Linux都失败。

既然不是URL编码的问题,我觉得应该是中文编码的问题。(在初学JavaWeb开发的第1年,遇到了各种各样的编码问题,所以现在很有经验了。)

String a = "程序员";

byte[] b = a.getBytes("iso8859-1");

System.out.println(new String(b, "utf-8"));

最终打印出来的是“程序员” ,这充分说明,linux线上环境是由于“中文编码解码不一致”导致的“乱码问题”。

@RequestMapping("search")

public String search( String keyword)。

最开始,我仍然搞错了一点,以为keyword还是url编码,还需要一次解码。
后来发现,SpringMVC接收参数的时候,会自动进行url解码,这个时候的keyword已经是“字符” 了。

我的解决方法:

log.info("searchKey=" + keyword);

searchService.search(luceneIndexDir, keyword, pageVo);

//可能是参数乱码导致的

if (pageVo.getTotalCount() <= 0) {

//浏览器发送的中文参数虽然是url编码的,但是spring也会自动解码,之所以乱码,应该是url编码和url解码的“字符集编码”不同导致的。

//如果遇到这种情况,线上linux遇到了,再把iso5559-1的字符串转换为utf-8的

log.info("search url iso8859-1,when in is:"+keyword);

byte[] b =keyword.getBytes("iso8859-1");

keyword=new String(b, "utf-8");

searchService.search(luceneIndexDir, keyword, pageVo);

log.info("search url iso8859-1,when out is:"+keyword);

}

如果第一次,没有查询到任何结果,很有可能就是“中文乱码”,再转换成正确的字符,再查询一次。
 

我的这种方法,真心不是最好的。但是,我暂时没能尝试出万能的一次性解法,Windows上正常,Linux不正常,很难搞。
只能,通过2次查询来确保,不是由于乱码,查询不到内容。

-----------------------------

上面是,14日写的。

今天补充一个“最佳解决方案”:

服务器上修改Tomcat的URIEncoding为UTF-8

对于URL传递中文参数乱码这个问题,其处理方法比较特殊,仅仅转换这个中文字符串或者设置JSP页面显示编码都是不能解决问题的,需要修改Tomcat服务器的配置文件才能解决问题。在这里修改Tomcat的conf目录下的server.xml配置文件,具体改后的代码如下

server.xml

<Connector port="8080" protocol="HTTP/1.1" URIEncoding="UTF-8"

connectionTimeout="20000"

redirectPort="8443" />

在原来代码中添加URI编码设置URIEncoding=“UTF-8”即可,重启Tomcat服务器可以得到正确的页面。其原理也和上面的情况类似,就是向程序指明编码类型,然后显示就正常了。

看这篇文章的时候,想到应该是这个问题。

http://blog.csdn.net/beijiguangyong/article/details/7414247

我一般不喜欢修改Tomcat的配置,喜欢用“默认”的。

URL传递中文参数,大坑一枚,Windows与Linux效果竟然不一致(两种解决方法)的更多相关文章

  1. asp.net URL传递中文参数System.Web.HttpUtility.UrlEncode与Server.UrlEncode的区别

    asp.net URL传递中文参数System.Web.HttpUtility.UrlEncode与Server.UrlEncode的区别(一) HttpUtility.UrlEncode 方法: 对 ...

  2. 通过URL传递中文参数的乱码处理

    环境:web.xml中配置了 <filter> <filter-name>encodingFilter</filter-name> <filter-class ...

  3. url 传递中文参数乱码问题的终极解决方法。

    估计很多人在做web开发的时候,都会碰到过url传递中文参数,有时候会出现乱码的问题,但有些项目或者环境,又不会有问题.当遇到乱码的时候,上网找了很多解决方案,比如: 页面设置它的编码方式,改成utf ...

  4. 关于JAVA中URL传递中文参数的问题

    今天在调用一个接口时,需要传递一个中文参数,结果获取不到数据,原因就在于中文传参的编码问题. 问题来源:URL url= new URL("http://XXX?OrganName=司法厅& ...

  5. Java中url传递中文参数取值乱码的解决方法

    java中URL参数中有中文值,传到服务端,在用request.getParameter()方法,得到的常常会是乱码,这将涉及到字符解码操作. 方法一: http://xxx.do?ptname=’我 ...

  6. JS中的的Url传递中文参数乱码,如何获取Url中参数问题

    一:Js的Url中传递中文参数乱码问题,重点:encodeURI编码,decodeURI解码: 1.传参页面Javascript代码:<script type=”text/javascript” ...

  7. JS URL传递中文参数时出现乱码的处理

    在浏览器中显示的地址是这样的: 但是按F12调试的时候的地址却变化掉了: 这个肯定是是因为浏览器对url路径默认编码了.这个问题是在我们去取值的时候,得到的就是后面那一大串稀奇古怪的东西.得不到我们想 ...

  8. c#asp.net url 传递中文参数要使用 System.Web.HttpUtility.UrlEncode 而不能使用Server.UrlEncode

    最近网站里的参数包括中文的例如: http://www.taiba/Tag%b0%ae%c7%e9.html 已开始使用 Server.UrlEncode来做的,但发现,有一些中文在url重写的是说找 ...

  9. URL传递中文参数乱码问题

    web项目开发中,经常遇到中文参数乱码问题,而且有时候明明测试服务器上好用,换个正式环境就不用的情况也经常出现,今天做一个记录,防止自己以后忘记 1.地址栏url请求带中文参数 这类

随机推荐

  1. C Tricks(十八)—— 整数绝对值的实现

    为正还是为负:(对 int 类型而言,第一位为符号位,其余为数值,则右移 31 位,再与 1 求与) 如果为正 ⇒ 返回原值 如果为负 ⇒ 对其二进制形式各位取反 + 1 int abs(int x) ...

  2. Android 网络图片Url 转 Bitmap

    注意:该方法必须要在子线程中调用,因为涉及网络请求 public Bitmap getBitmap(String url) { Bitmap bm = null; try { URL iconUrl ...

  3. HibernateCRUD基础框架(2)-HQL语句构造器(HqlQueryBuilder,HqlUpdateBuilder)

    上篇讲述了最基本的实体类,本篇接着讲述HQL语句构造器,包括查询和更新等. 优点:通过面向对象的方式构造HQL语句,更快捷,不需要手动拼接HQL. 缺点:封装可能降低性能,只能支持常用的和较为简单的H ...

  4. HDU 5237 Base64

    Base64 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Sub ...

  5. VMware linux虚拟机在线识别新添加磁盘

    登录进虚拟机linux系统中执行以下命令,识别新增加的硬盘 echo "- - -" > /sys/class/scsi_host/host0/scan # ls /sys/ ...

  6. 【AtCoder ABC 075 B】Minesweeper

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 模拟,把#换成1 八个方向加一下就好. [代码] #include <bits/stdc++.h> using name ...

  7. ORACLE RMAN备份及还原 RMAN能够进行增量备份:数据库,表空间,数据文件

    ORACLE RMAN备份及还原   RMAN能够进行增量备份:数据库.表空间.数据文件 仅仅有使用过的block能够被备份成backup set 表空间与数据文件相应关系:dba_data_file ...

  8. Java反射学习总结终(使用反射和注解模拟JUnit单元测试框架)

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 本文是Java反射学习总结系列的最后一篇了,这里贴出之前文章的链接,有兴趣的可以打开看看. ...

  9. POJ 1012 Joseph 约瑟夫问题

    http://poj.org/problem?id=1012 早上去图书馆复习苦逼的复习....万恶的数逻.T T我还要自我安慰的说复习完了奖励回来刷水题~ 10点多的时候外面校运会大吼撑杆跳的那个. ...

  10. 30、在LCD上显示摄像头图像

    1. 准备虚拟机2.安装工具链sudo tar xjf arm-linux-gcc-4.3.2.tar.bz2 -C /设置环境变量:sudo vi /etc/environment : PATH=& ...