在網上搜了不少資料都沒有搞定,通常都有如下幾種說法:javascript
方法1:在後臺中先得到字符串的iso-8859-1編碼形式數組,再使用此數組實例一個UTF-8編碼形式String類型字符串.html
頁面提交的url爲:java
leavesp?work=部門主管審批web
後臺處理:數組
String inStr=request.getParameter("work ");tomcat
String outStr = new String(inStr.getBytes("iso-8859-1"),"UTF-8");app
方法2:在頁面傳遞過來時先經過JavaScript將URL編碼,再到後臺進行解碼:jsp
頁面部分:函數
<script type="text/javascript">post
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中頁面亂碼問題採用過濾器過濾,問題通常都能解決。