jsp教程中文亂碼的處理方法
在jsp代碼中以下幾處經常需要涉及到中文處理:
1. 在url中附帶中文參數。這裡中文參數通常可以直接讀取,例如: <%= request.getparameter("showword")%>
2. 在jswdk中讀取html表單提交的中文值這時需要加以編碼,較為簡潔的寫法是:
string name1=new string(request.getparameter("user_id").getbytes("iso8859_1"))。
另外,在jdk 1.3的支援下,不需加入<%@ page contenttype="text/html;charset=gb2312"%> ,而在jdk 1.2.2 以下,即使以上兩種方法同時運用也很不穩定。但在resin平台,情況較好,只要在頁面第一行加入:<%@ page contenttype="text/html;charset=gb2312"%>即可正確處理中文,如果再加代碼則反而不對。
3.在jswdk中session包含的中文,如果從表單中讀出的值經過編碼可正確顯示,但直接賦予中文值則不行,而resin平台則很好。
4. 在編譯servlet和jsp時加入代碼選項。在編譯servlet時使用java-encoding iso8859-1 myservlet.java;在jsp的zone設定檔中,修改編譯參數為:compiler=builtin - javac- encoding iso8859-1。使用這種方法後,不需要做其他的改動就可以正常顯示中文了。
另外,流行的關聯式資料庫教程系統都支援資料庫encoding,也就是說在建立資料庫時可以指定它自己的字元集設定,資料庫的資料以指定的編碼形式儲存。當應用程式訪問資料時,在入口和出口處都會有 encoding 轉換。對於中文資料,資料庫字元編碼的設定應當保證資料的完整性。 gb2312、gbk、utf-8 等都是可選的資料庫 encoding,也可以選擇 iso8859-1 (8-bit), 但會增加了編程的複雜度,iso8859-1不是推薦的資料庫 encoding。在jsp/servlet編程時,可以先用資料庫管理系統提供的管理功能檢查其中的中文資料是否正確。
處理方法執行個體
下面是兩個具體的中文亂碼解決執行個體,讀者仔細研究後可能會有所收穫。
1.常見的字元轉換方法
將form 中 的 值 傳 送 到 數 據 庫 中 再 取 出 來 後 全 變 成 了"?"。form用post提交資料,代碼中使用了語句:string st=new(request.getparameter("name").getbytes("iso8859_1")), 而且也聲明了charset=gb2312。
要處理form中傳遞的中文參數,應該在jsp中加入下面的代碼,另外定義一個專門解決這個問題的getstr類,然後對接收到的參數進行轉換:
string keyword1=request.getparameter("keyword1");
keyword1=getstr(keyword1);
這樣就可以解決問題了,代碼如下:
<%@ page contenttype="text/html;charset=gb2312"%>
<%!
public string getstr(string str){
try{string temp_p=str;
byte[] temp_t=temp_p.getbytes("iso8859-1");
string temp=new string(temp_t);
return temp;
}
catch(exception e){ }
return "null";
}
%>
<%--http://www.cndes.com測試--%>
<% string keyword="創連網絡技術中心歡迎您的到來";
string keyword1=request.getparameter("keyword1");
keyword1=getstr(keyword1);
out.print(keyword);
out.print(keyword1);
%>
再看一款頁面與資料庫中文亂碼處理方法
post.jsp
<form method="post" action="addmsg.jsp">
name:<input type="text" name="name" >
<input type="submit" value="submit">
</form>
<html>
<head>
<title>使用jdbc直接存取資料庫</title>
</head>
<%@ page contenttype="text/html;charset=gb2312" %>
<%@ page import="java.sql.*" %>
<%
//string name=new string(request.getparameter("name").getbytes("iso8859_1"),"gbk");
string name = request.getparameter("name");
out.println(name);
class.forname("org.gjt.mm.mysql教程.driver");
connection
con=drivermanager.getconnection("jdbc:mysql://localhost/bbs?useunicode=true&characterencoding=utf-8","root","123456");
statement stmt=con.createstatement();
string sql="insert into book(name)values('"+name+"')";
int value;
value=stmt.executeupdate(sql);
if(value>0)
{
out.println("ok");
}
else
{
out.println("no");
}
stmt.close();
con.close();
%>
</table>
</body>
</html>