在網上搜了不少資料都沒有搞定 , 通常都有如下幾種說法 :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 傳遞過來的中文處理過程以下:
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.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);
看到這裏,你應該也已經會處理中文亂碼問題了。趕忙試試!! ^_^
這是我我的處理中文亂碼的經驗,我將它拿來分享與各位,若是中間有寫得不對的地方還請各位幫忙指正。謝謝