用UTF-8完全解決JSP+MYSQL多國語言文字編碼問題
此問題這是本人經過數(shù)天努力,查遍網(wǎng)上所有此類文章最后自己解決的。轉載請務必注明出處:
http://blog.donews.com/ralix/
首先說明幾點:
在文件中任何時候出現(xiàn)utf-8、UTF-8、utf8、UTF8其作用都是一樣的。tomcat、resin、mysql可沒有我們這么笨。網(wǎng)上許多文章還煞有介事的特別指出其一個個的區(qū)別,純屬無稽之談。
我的軟件環(huán)境:
中文WINDOWS XP (linux可作相應修改)
Apache Tomcat 5.5.6 Server
phpMyAdmin 2.6.4-pl4
MySQL 5.0.19-nt
按下面步驟修改:
一、在JSP靜態(tài)文件中正確顯示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里數(shù)據(jù)庫和表也都設為utf8_unicode_ci
3、數(shù)據(jù)庫連結:jdbc:mysql://localhost/mydb?useUnicode=true&characterEncoding=utf-8
注意,關鍵就在于此:此句中間是‘&‘不是‘&‘在www.Jdon.com的banq和許多牛人的文章中都寫成了‘&‘。這可能是發(fā)文章時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"
至此,在頁面上顯示中文、從數(shù)據(jù)庫讀取并顯示、插入、修改中文都正常了。
并且由于是utf-8,您可以試一下,在form里同時輸入中文、英文、日文、韓文,照樣正常顯示。
PS:
雖然沒有完全測試過,但在我的使用中操作系統(tǒng)、JDK、TOMCAT或resin的編碼對此問題沒有造成影響。
我測試時resin初始化顯示的JDK就是GBK、zh,但沒有問題。
另外,.java文件是utf-8還是ascii編碼都沒有關系,生成的.class一樣能用。
經樓下朋友的提醒,我需要補充一下:
1、數(shù)據(jù)庫連結時,在.jsp和.java文件中應該用&號,而XML文件中需要用& 這也是banq的本意。只是我們太菜沒能直接領會。
2、在我的測試中,connector-J已經是3.0以上但如果不加useUnicode=true&characterEncoding=utf-8訪問數(shù)據(jù)庫還是會有問題。所以建議還是加上。
PS2:
對用GET提交的中文問題,修改tomcat/conf/server.xml
<Connector acceptCount=‘100‘ connectionTimeout=‘20000‘ .../>最后加入:URIEncoding=‘utf-8‘
PS3:
最近發(fā)現(xiàn)MYSQL在windows/my.ini里,必須寫成utf8,這是與mysql/share/charsets里的編碼相對應的。
大功告成,語言大統(tǒng)。
Trackback: http://tb.donews.net/TrackBack.aspx?PostId=777696