国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

Java Web開發(fā)中文亂碼問題的研究與解決

2012-04-29 02:31:34李響郝靜靜
電腦知識(shí)與技術(shù) 2012年1期

李響 郝靜靜

摘要:在利用Servlet/JSP技術(shù)開發(fā)Java Web應(yīng)用程序的時(shí)候,不可避免的會(huì)遇到中文亂碼問題,本文首先介紹了Web應(yīng)用中常用的編碼方式,然后分析了J2EE平臺(tái)下Web應(yīng)用中文亂碼問題產(chǎn)生的原因,并在此基礎(chǔ)上針對不同情況提出了解決方案。

關(guān)鍵詞: Java Web開發(fā);中文亂碼;字符編碼

中圖分類號:TP311文獻(xiàn)標(biāo)識(shí)碼:A文章編號:1009-3044(2012)01-0062-02

Research and Solution of Chinese Garbled in Java Web Programming

LI Xiang,HAO Jing-jing

(Software College of Kaifeng University, Kaifeng 475004, China)

Abstract: In the use of Servlet/ JSP technology to develop Java Web application, will inevitably encounter the problem of Chinese characters encoding, this paper introduces the encoding mode in application of Web, and then analyses the causes of Chinese garbled on the J2EE platform Web application, and gives each case of the solution.

Key words: Java Web developing; Chinese garbled; character encoding

在Java Web應(yīng)用開發(fā)中,經(jīng)常會(huì)出現(xiàn)頁面中本該顯示中文的地方卻是亂碼的情況。究其原因,主要是由于在Web組件之間、或Web組件與瀏覽器、與數(shù)據(jù)庫所使用的字符集標(biāo)準(zhǔn)不統(tǒng)一,Web應(yīng)用程序運(yùn)行過程中,中文字符往往需要在不同的字符集之間來回轉(zhuǎn)換,這就導(dǎo)致了中文亂碼問題的頻繁出現(xiàn)。本文從Web應(yīng)用的常用編碼出發(fā),詳細(xì)討論Java Web應(yīng)用開發(fā)中出現(xiàn)中文亂碼的原因以及解決辦法。本文討論的環(huán)境是基于JDK5.0,服務(wù)器為Tomcat5.5,數(shù)據(jù)庫為MySQL 5.0。

1 Web應(yīng)用的常用編碼

Web應(yīng)用中常用的編碼主要有ISO8859-1,GB2312,GBK,Unicode和UTF- 8。

1.1 ISO8859-1

ISO8859-1,是國際標(biāo)準(zhǔn)化組織內(nèi)ISO/IEC 8859的第一個(gè)8位字符集,屬于單字節(jié)編碼,最多能表示的字符范圍是0- 255,應(yīng)用于英文系列。

1.2 GB2312/ GBK

GB2312和GBK是中華人民共和國國家標(biāo)準(zhǔn)漢字信息交換用編碼,簡稱國標(biāo)碼,專門用來表示漢字,是雙字節(jié)編碼。其中GBK編碼能夠用來同時(shí)表示繁體字和簡體字,而GB2312只能表示簡體字。

1.3 Unicode

Unicode(統(tǒng)一的字符編碼標(biāo)準(zhǔn)集)使用2個(gè)字節(jié)對每一個(gè)字符進(jìn)行編碼,是Java語言默認(rèn)的字符集。

1.4 UTF- 8

UTF-8編碼,用1到6個(gè)字節(jié)編碼Unicode字符,用在網(wǎng)頁上可以在同一頁面顯示中文簡體繁體及其他語言。

2 Web應(yīng)用中的中文亂碼問題的分析

在Web應(yīng)用中,通常包括了瀏覽器、Web服務(wù)器、Web應(yīng)用程序和數(shù)據(jù)庫等部分,每一部分都有可能使用不同的字符集,從而導(dǎo)致字符數(shù)據(jù)在各種不同的字符集之間轉(zhuǎn)換時(shí)出現(xiàn)亂碼問題。

在弄清Web應(yīng)用中的中文亂碼問題前,先明確理解Java Web開發(fā)中所用到的JSP/Servlet應(yīng)用程序中的幾個(gè)有關(guān)編碼設(shè)置的方法。

在JSP/Servlet中主要有以下幾種方式可以設(shè)置編碼("***"表示編碼方式):

1) pageEncoding="***"

2) contentType="text/html;charset=***

3) request.setCharacterEncoding("***")

4) response.setCharacterEncoding("***")

其中前兩個(gè)只能用于JSP中,而后兩個(gè)可以用于JSP和Servlet中。

1) pageEncoding="***"的作用是設(shè)置JSP編譯成Servlet時(shí)使用的編碼。

2) contentType="text/html;charset=***"的作用是指定對服務(wù)器響應(yīng)進(jìn)行重新編碼的編碼。

3) request.setCharacterEncoding("***")的作用是設(shè)置對客戶端請求進(jìn)行重新編碼的編碼。

4) response.setCharacterEncoding("***")的作用是指定服務(wù)器響應(yīng)客戶端請求時(shí)進(jìn)行重新編碼的編碼。JSP文件的運(yùn)行過程如圖1所示。

圖1 JSP文件的運(yùn)行過程圖

當(dāng)JSP引擎把JSP文件按pageEncoding所指定的編碼方法編碼轉(zhuǎn)換為Servlet文件時(shí),若pageEncoding沒有指定,則按照con? tentType所指定方法編碼。若二者都沒有指定,則將按照J(rèn)VM的默認(rèn)編碼方法進(jìn)行編碼。若這一步驟編碼不支持中文,則JSP文件中的中文轉(zhuǎn)化為Servlet文件時(shí)本身就是亂碼。

客戶端瀏覽器在發(fā)送和接收數(shù)據(jù)時(shí),按照J(rèn)SP文件的contentType所指定的編碼方式來對URL和參數(shù)編碼。服務(wù)器在接收數(shù)據(jù)時(shí),按照request.setCharacterEncoding的設(shè)置對數(shù)據(jù)進(jìn)行編碼,在發(fā)送數(shù)據(jù)時(shí),按照response.setCharacterEncoding—contentType—pa? geEncoding的優(yōu)先順序?qū)σl(fā)送的數(shù)據(jù)進(jìn)行URL編碼。在這個(gè)過程中,如果參數(shù)中包含中文,而沒有設(shè)置好編碼方式,服務(wù)器在處理數(shù)據(jù)的過程中就會(huì)出現(xiàn)中文亂碼問題。

3 Java Web開發(fā)中文亂碼問題的解決方法

3.1頁面顯示亂碼

如果在訪問某個(gè)JSP頁面或者Servlet產(chǎn)生的頁面時(shí),頁面上本應(yīng)顯示中文信息的地方,卻顯示為亂碼,這可能是瀏覽器顯示不正確,也可能是后臺(tái)在動(dòng)態(tài)生成界面的時(shí)候,其內(nèi)容就是亂碼。

如果是瀏覽器顯示的問題,需要設(shè)置JSP或者Servlet的contentType屬性。對于JSP中的設(shè)置使用的是page指令,設(shè)置如下:<% @page contentType=”text/html”;charset=”GB2312”>

對于Servlet生成的頁面,可以在輸出頁面之前調(diào)用response的setContentType( )方法,其代碼形式如下:response.setContentType(“text/html;charset=GB2312”)

另外,在生成的HTML文件的頭部可以加入如下代碼:

以減少中文亂碼的發(fā)生。

3.2用戶提交的數(shù)據(jù)是亂碼

當(dāng)表單中提交的中文數(shù)據(jù)出現(xiàn)亂碼時(shí),原因是request對瀏覽器提交的數(shù)據(jù)解碼不正確。根據(jù)表單提交方式的不同,此類亂碼問題有兩種解決方法。

對于表單中POST方式提交的數(shù)據(jù),數(shù)據(jù)是作為請求的消息體發(fā)送的,默認(rèn)情況下采用ISO8859-1編碼,所以要設(shè)置請求對象的字符編碼,代碼形式如下:

request.setCharacterEncoding("GB2312")

在響應(yīng)頁面上使用response.setCharacterEncoding("GB2312")設(shè)置編碼方式。

如果需要處理的頁面過多時(shí),單個(gè)處理就會(huì)比較麻煩,這時(shí)可以通過設(shè)置過濾器將所有的request編碼都進(jìn)行設(shè)置。

對于表單中GET方式提交的數(shù)據(jù)或者URL提交的數(shù)據(jù),只在接收數(shù)據(jù)的JSP文件或Servlet文件中設(shè)置request.setCharacterEn? coding參數(shù)是不行的,因?yàn)樵赥omcat5.0中,默認(rèn)情況下使用ISO8859-1對URL提交的數(shù)據(jù)和表單中GET方式提交的數(shù)據(jù)進(jìn)行編碼。因此,在這種情況下,需要修改Tomcat的server.xml文件。具體方法如下:

在Tomcat的server.xml文件中,在port號為8080的Connector元素中增加一個(gè)屬性:URIEncoding="GB2312"。

3.3數(shù)據(jù)庫中的數(shù)據(jù)是亂碼

如果在寫入數(shù)據(jù)庫的時(shí)候出現(xiàn)亂碼,而我們確定是以GB2312的編碼方式發(fā)送到數(shù)據(jù)庫上的,那么說明數(shù)據(jù)庫可能不支持GB2312的格式。如果數(shù)據(jù)庫支持中文,那么亂碼問題可能就是出現(xiàn)在讀取數(shù)據(jù)庫的過程中發(fā)生了編碼轉(zhuǎn)化。

以MySQL 5.0為例,解決中文漢字編碼可以采取下面的方法:

1)在向表中插入中文時(shí),先把中文字符編碼轉(zhuǎn)換為ISO8859-1編碼,然后再插入表中,而讀取時(shí),先把數(shù)據(jù)庫中的內(nèi)容轉(zhuǎn)換為GB2312編碼,再讀取。這種方式雖然有效,但是使用起來非常繁瑣,而且容易出錯(cuò)。全球化軟件開發(fā)中要求盡量避免使用這種編碼方式。

2)修改MySQL的配置文件。打開< MYSQL_HOME> my.init文件,把[ mysqld]區(qū)的語句default-characterset=latin1修改為de? fault-characterset=GB2312,在[client]區(qū)增加default-characterset= GB2312。修改后,數(shù)據(jù)庫默認(rèn)支持的編碼格式就被改成了GB2312編碼,這樣就根本解決了MySQL的數(shù)據(jù)庫亂碼問題。

4結(jié)論

綜上所述,我們了解了Web應(yīng)用中常用的編碼方式,分析了Java Web應(yīng)用開發(fā)過程中的編碼轉(zhuǎn)換,找到了在J2EE平臺(tái)下Web應(yīng)用中出現(xiàn)中文亂碼問題的根源,并針對不同的情況給出了具體的解決方案,這對于解決中文亂碼問題,將會(huì)有很大的幫助。

參考文獻(xiàn):

[1]孫衛(wèi)琴.Tomcat與Java Web開發(fā)技術(shù)詳解[M].北京:電子工業(yè)出版社,2005.

[2]孫鑫.Java Web開發(fā)詳解[M].北京:電子工業(yè)出版社,2007.

[3]劉永立.Java環(huán)境下Web程序的中文亂碼問題與對策[J].電腦編程技巧與維護(hù),2011(14):136-139.

[4]張洪偉.Tomcat Web開發(fā)及整合應(yīng)用[M].北京:清華大學(xué)出版社,2006.

[5]劉長生,謝強(qiáng),丁秋林.Java應(yīng)用中的漢字亂碼問題分析[J].計(jì)算機(jī)科學(xué)與發(fā)展,2006,16(1):158-161.

[6]耿祥義,張躍平.JSP實(shí)用教程[M].北京:清華大學(xué)出版社,2007.

[7]李剛.輕量級JavaEE企業(yè)應(yīng)用實(shí)戰(zhàn)——Struts 2+Spring+Hibernate融合開發(fā)[M].北京:電子工業(yè)出版社,2008.

[8]金恩華,徐良賢.J2EE Web應(yīng)用中漢字編碼的研究[J].計(jì)算機(jī)應(yīng)用與軟件,2005(22).

南康市| 渝中区| 龙井市| 合肥市| 大兴区| 盐亭县| 南阳市| 天峻县| 贞丰县| 武夷山市| 柞水县| 万载县| 乃东县| 晋州市| 松溪县| 宁远县| 舞钢市| 沂水县| 寿宁县| 界首市| 崇明县| 宁河县| 共和县| 剑川县| 颍上县| 大厂| 涪陵区| 新沂市| 龙门县| 延寿县| 宽城| 翁源县| 乌兰县| 汶上县| 城固县| 平顺县| 海安县| 从江县| 元江| 怀仁县| 健康|