liunx 上get 不到url参数 java_URL传递中文参数,大坑一枚,Windows与Linux效果竟然不一致...
下午,計劃2個小時搞定,個人官網第6次升級,就可以干點輕松的事了,結果,下午多搞了2個小時,晚上又搞了2個小時,才搞定。最后一個世界難題是,URL傳遞中文參數。問題大致是這么出現的:我為“博客雷觀”?這個欄目,增加了“全文搜索”功能,用lucene實現的。因此,需要傳遞中文參數。搜索框表單提交,傳遞中文,很簡單就搞定了。? ?搜索之后的分頁url,需要帶上當前的“搜索詞”?,比如“程序員”,我在本地很輕松就搞定了。無非就是這樣:search/search.html?keyword=${keyword}"? keyword就是中文詞匯,比如“程序員”。? ?我本以為,扔到服務器上,重啟一次,就萬事大吉了,結果點擊第2頁的時候,沒有搜索到任何文章。查看日志,發(fā)現搜索詞是“亂碼” 。? 我第一反應是,傳遞的中文“程序員”?沒有正確地進行url編碼,所以:
把搜索詞編碼之后,再附帶在Url之后,但是:Windows本地環(huán)境,ok,worked。但是,線上Linux環(huán)境,仍然不行。圍繞著是否正確了編碼,在QQ、Chrome、IE上反復嘗試了N次。結果,無論是否進行url編碼,本地Windows的所有瀏覽器都能夠正常地傳遞中文參數,線上Linux都失敗。既然不是URL編碼的問題,我覺得應該是中文編碼的問題。(在初學JavaWeb開發(fā)的第1年,遇到了各種各樣的編碼問題,所以現在很有經驗了。)
String a = "?¨??o????";
byte[] b = a.getBytes("iso8859-1");
System.out.println(new String(b, "utf-8"));最終打印出來的是“程序員” ,這充分說明,linux線上環(huán)境是由于“中文編碼解碼不一致”導致的“亂碼問題”。
@RequestMapping("search")
public String search( String keyword)。最開始,我仍然搞錯了一點,以為keyword還是url編碼,還需要一次解碼。后來發(fā)現,SpringMVC接收參數的時候,會自動進行url解碼,這個時候的keyword已經是“字符”?了。我的解決方法:
log.info("searchKey=" + keyword);
searchService.search(luceneIndexDir, keyword, pageVo);
//可能是參數亂碼導致的
if (pageVo.getTotalCount() <= 0) {
//瀏覽器發(fā)送的中文參數雖然是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次查詢來確保,不是由于亂碼,查詢不到內容。
原文:http://blog.csdn.net/fansunion/article/details/41929563
總結
以上是生活随笔為你收集整理的liunx 上get 不到url参数 java_URL传递中文参数,大坑一枚,Windows与Linux效果竟然不一致...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: console用法java_使用cons
- 下一篇: java 缘起_缘起 网络编程