jsp使用URL編碼傳遞中文參數問題
Jsp頁面使用URL編碼傳遞中文參數的情況下,在參數的解析過程中會出現亂碼。由於java在設計的時候考慮到了國際化的問題,在java來源程式編譯成位元組碼的時候預設使用的是UTF-8編碼。而在web運用上,由於不同的瀏覽器向伺服器發送的資訊採用的編碼方式不同,在由像tomcat之類的伺服器解碼的時候會由於編碼方式的不同而產生亂碼,這是一個會困擾jsp初學者很久的問題。以前在使用struts的時候不需要處理這些問題,前些天在做一個簡單的jsp頁面的時候碰到這個問題。經過半天的摸索,基本解決了該問題。例子中a.jsp頁面通過URL編碼的方式傳遞中文參數,在b.jsp中對該參數進行解析。a.jsp原始碼<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312" /><title>無標題文檔</title></head> <body><% String str_test = "華工";%><form method=post action="b.jsp?test=<%=java.net.URLEncoder.encode(str_test) %>"> <input type="submit" value="Submit" name="提交"> </form> </body></html> b.jsp原始碼<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312" /><title>無標題文檔</title></head> <body> <% String str = new String(request.getParameter("test").getBytes("ISO8859_1"));%> <BR> <%=str %> </body></html>說明:在使用了java.net.URLEncoder.encode 編碼後,頁面擷取參數request.getParameter後需要使用ISO8859_1編碼轉換。此外,在jsp的字元集聲明中把charset=UTF-8也沒有問題。
jsp傳遞中文參數亂碼問題的解決方案 在用中文作為參數傳給處理頁面進行處理時發現是亂碼。以往聽說過是由於編碼問題造成的,但就是無法解決。今天總算找到相關的解決方案。很簡單:在每個jsp頁面加上下面3行 <%@ page pageEncoding="GBK"%> <%@ page contentType="text/html;charset=GBK"%> <%request.setCharacterEncoding("GBK");%> 把GBK改成gb2312也可以,區別就是GBK不僅支援簡體中文還支援繁體而gb2312隻支援簡體中文
jsp傳遞中文參數、空格以及表單內容換行問題解決小結
一、地址傳遞參數中文/空格問題
舉例說明:
String sContent = "中文 參數";
如果不做任何處理就直接傳遞,中文也許沒有問題(但不保證),但空格肯定會有問題,到接收頁面無法識別。
解決辦法1:java.net.URLEncoder.encode(sContent,"gb2312"); 然後再傳遞。比如url是"accept.jsp?content="+sContent;
讀取時,使用
String sc = request.getParameter("content");
sc = new String(sc.getBytes("iso-8859-1"),"gb2312");
解決辦法2:
傳遞前,先做以下替換
sContent=sContent.replaceAll(" ","%20");
接收到字串之後,如果在td中顯示,則需要使用
sContent=sContent.replaceAll(" "," ");//注意這裡不是替換%20,而是替換空格。如果有中文,要先轉碼
如果在textarea中顯示,則不需要處理。
這樣就沒問題了。
二、斷行符號換行問題
問題描述:
表單中的textArea中有換行的內容,提交之後儲存到資料庫,再讀取出來的時候,沒有換行,全部連在一起了。
解決:
1. 在寫入資料庫的時候,加入
sContent=sContent.replaceAll(" "," ");
sContent=sContent.replaceAll("/r/n","<br/>");
sContent=sContent.replaceAll("/n","<br/>");
2.在讀取的時候,如果要在textArea中顯示,需要加入
sc = 資料庫中的content欄位值 ;
sc=sc.replaceAll("<br/>","/r/n");
sc=sc.replaceAll("<br>","/r/n");
sc=sc.replaceAll(" "," ");
如果是直接在td中顯示,則不需要轉換 。
實際上這是我下面的那個文章,最近找出了問題出在哪了,就把問題重新寫的具體點.
但是不知道怎麼解決,不知道有沒有哪位高手站出來解決一下呢?
下面是My Code(是個分頁顯示問題)
D1和D2是從上一頁面得到的選擇條件參數,在SQL查詢時要用到
<%
String D1=request.getParameter("D1");
if(D1==null)
{D1="";
}
byte B1[]=D1.getBytes("ISO-8859-1");
D1=new String(B1);
String D2=request.getParameter("D2");
if(D2==null)
{D2="";
}
byte B2[]=D2.getBytes("ISO-8859-1");
D2=new String(B2);
out.print(D1);
out.print(D2);//我為了看D1,D2有沒有傳遞過來,讓他顯示一下!
%>
這是超級串連,page是分頁顯示時需要的當前頁代碼
<a href="gagea.jsp?page=<%=intPage+1%>&D1=<%=D1%>&D2=<%=D2%>">下一頁</a>
當我點串連時,網頁地址欄顯示正確(3個參數都傳遞過去了),但是頁面中卻都是??????,我想是中文參數傳遞問題,但不知道具體怎麼解決
雖然代碼不詳細,但相信高手們一看就知道問題出在哪了,請幫個忙吧,謝謝,這兩天因為這一個問題把我頭都弄大了,鬱悶!