用UTF-8完全解決JSP+MYSQL多國語言文字編碼問題
此問題這是本人經過數天努力,查遍網上所有此類文章最後自己解決的。轉載請務必註明出處:
http://blog.donews.com/ralix/
首先說明幾點:
在檔案中任何時候出現utf-8、UTF-8、utf8、UTF8其作用都是一樣的。tomcat、resin、mysql可沒有我們這麼笨。網上許多文章還煞有介事的特別指出其一個個的區別,純屬無稽之談。
我的軟體環境:
中文WINDOWS XP (linux可作相應修改)
Apache Tomcat 5.5.6 Server
phpMyAdmin 2.6.4-pl4
MySQL 5.0.19-nt
按下面步驟修改:
一、在JSP靜態檔案中正確顯示UTF-8:
1、JSP檔案用支援UTF-8的文字編輯器編輯,如EditPlus、UltraEdit,並把原來ascii轉換成utf-8(菜單裡有)。
2、JSP檔案頭改成:
<%@ page contentType="text/html; charset=UTF-8" language="java" import="java.sql.*"%>
有無這句無所謂(但在.html檔案中是必要的):
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
</head>
二、FORM的正確提交:
1、getParameter之前加入:
request.setCharacterEncoding("utf-8");
這一步也可以用Filter的辦法,參見其它文章。
2、request時,只需要寫成最簡單的形式:
String name1= new String(request.getParameter("username"));
String pwd1= new String(request.getParameter("password"));
三、串連mysql:
1、mysql設定檔:
修改mysql在windows/my.ini裡default-character-set=utf-8
2、mysql裡資料庫和表也都設為utf8_unicode_ci
3、資料庫連結:jdbc:mysql://localhost/mydb?useUnicode=true&characterEncoding=utf-8
注意,關鍵就在於此:此句中間是'&'不是'&'在www.Jdon.com的banq和許多牛人的文章中都寫成了'&'。這可能是發文章時html自動轉化的。但這的確給我們帶來了很大的麻煩。會產生如下錯誤或問號:
java.sql.SQLException:
Syntax error or access violation, message from server: "You have an
error in your SQL syntax; check the manual that corresponds to your
MySQL server version for the right syntax to use near ''asdf' at line
1"
至此,在頁面上顯示中文、從資料庫讀取並顯示、插入、修改中文都正常了。
並且由於是utf-8,您可以試一下,在form裡同時輸入中文、英文、日文、韓文,照樣正常顯示。
PS:
雖然沒有完全測試過,但在我的使用中作業系統、JDK、TOMCAT或resin的編碼對此問題沒有造成影響。
我測試時resin初始化顯示的JDK就是GBK、zh,但沒有問題。
另外,.java檔案是utf-8還是ascii編碼都沒有關係,產生的.class一樣能用。
經樓下朋友的提醒,我需要補充一下:
1、資料庫連結時,在.jsp和.java檔案中應該用&號,而XML檔案中需要用& 這也是banq的本意。只是我們太菜沒能直接領會。
2、在我的測試中,connector-J已經是3.0以上但如果不加useUnicode=true&characterEncoding=utf-8訪問資料庫還是會有問題。所以建議還是加上。
PS2:
對用GET提交的中文問題,修改tomcat/conf/server.xml
<Connector acceptCount='100' connectionTimeout='20000' .../>最後加入:URIEncoding='utf-8'
PS3:
最近發現MYSQL在windows/my.ini裡,必須寫成utf8,這是與mysql/share/charsets裡的編碼相對應的。
大功告成,語言大統。
-------------------------------------------------以上為網上轉載----------------------------------------
補充:
若是get請求,request會用容器預設的編碼方式,故參數的編碼就要出錯,post則以請求來源頁面的編碼為準,故若要使用get請求,就要修改tomcat的server.xml