• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      Java Web應(yīng)用開(kāi)發(fā)中的常見(jiàn)亂碼形式及解決方法

      2017-06-20 08:57:17賈曉芳沈澤剛
      軟件導(dǎo)刊 2017年4期
      關(guān)鍵詞:web技術(shù)

      賈曉芳+沈澤剛

      摘要:在運(yùn)用Java Web 技術(shù)開(kāi)發(fā)Web應(yīng)用程序時(shí),要根據(jù)計(jì)算機(jī)存儲(chǔ)以及傳輸?shù)淖址幋a的標(biāo)準(zhǔn)進(jìn)行編程,字符編碼不統(tǒng)一會(huì)導(dǎo)致多種情況的亂碼問(wèn)題。從亂碼問(wèn)題產(chǎn)生的根本原因著手分析,從字符編碼以及轉(zhuǎn)換關(guān)系對(duì)影響字符編碼的因素進(jìn)行系統(tǒng)分析,并給出可行的解決方案。

      關(guān)鍵詞:Java Web技術(shù);字符編碼;中文亂碼

      中圖分類(lèi)號(hào):TP301

      文獻(xiàn)標(biāo)識(shí)碼:A

      文章編號(hào):16727800(2017)004021403

      0引言

      Java語(yǔ)言在應(yīng)用軟件開(kāi)發(fā)方面逐漸取代其它編程語(yǔ)言成為網(wǎng)絡(luò)編程首選語(yǔ)言。Java技術(shù)提供跨平臺(tái)性,支持網(wǎng)絡(luò)與數(shù)據(jù)庫(kù)技術(shù),已廣泛應(yīng)用于移動(dòng)互聯(lián)網(wǎng)、網(wǎng)絡(luò)開(kāi)發(fā)平臺(tái)等領(lǐng)域。在Java Web應(yīng)用開(kāi)發(fā)過(guò)程中,伴隨著各種亂碼問(wèn)題的出現(xiàn),這給程序員的軟件開(kāi)發(fā)工作帶來(lái)很多麻煩,解決亂碼問(wèn)題是Java Web應(yīng)用程序開(kāi)發(fā)過(guò)程中需解決的首要問(wèn)題。本文將對(duì)開(kāi)發(fā)過(guò)程中常出現(xiàn)的幾種亂碼問(wèn)題的原因及影響因素進(jìn)行分析,并給出具體可行的解決方案。

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

      在Java Web應(yīng)用開(kāi)發(fā)中,字符編碼轉(zhuǎn)化是必要過(guò)程,常用到UTF-8、Unicode、GB2312/GBK、ISO-8859-1這幾類(lèi)。UTF-8是廣泛應(yīng)用于程序開(kāi)發(fā)中的雙字節(jié)編碼,在Unicode字符集中以一種多字節(jié)編碼的形式存在,能與Unicode編碼進(jìn)行可逆字符轉(zhuǎn)換同時(shí)兼容ISO-8859-1編碼。該編碼本身帶有校驗(yàn)功能,在網(wǎng)頁(yè)上多會(huì)出現(xiàn)關(guān)于中文簡(jiǎn)體或者其它語(yǔ)言的提醒。Unicode編碼是統(tǒng)一字符編碼的標(biāo)準(zhǔn)集,是唯一的二進(jìn)制計(jì)算機(jī)字符編碼,能表示所有語(yǔ)言的字符,不受語(yǔ)言與運(yùn)行平臺(tái)的限制,可以進(jìn)行跨語(yǔ)言、跨平臺(tái)的文本轉(zhuǎn)換操作,使用0~65 535的雙字節(jié)無(wú)符號(hào)對(duì)每一個(gè)字符進(jìn)行編碼,確保每個(gè)字符的表示方式唯一。 GB2312/GBK編碼屬于國(guó)標(biāo)碼,用來(lái)表示中文的雙字節(jié)字符編碼,其中GBK編碼表示簡(jiǎn)體字和繁體字,完全兼容GB2312編碼,屬于GB2312編碼的擴(kuò)充編碼,GB2312編碼可以兼容ASCII碼,但僅能表示中文簡(jiǎn)體字。ISO-8859-1編碼屬于單字節(jié)編碼,向下兼容ASCII碼,應(yīng)用于英文系統(tǒng),字符范圍只有0~255,無(wú)法表示中文字符,在很多協(xié)議上作為默認(rèn)編碼,在Java網(wǎng)絡(luò)傳輸中作為標(biāo)準(zhǔn)字符集應(yīng)用。 在英文字符的網(wǎng)頁(yè)上只能使用ISO-8859-1編碼,在只出現(xiàn)中文的網(wǎng)頁(yè)上,只能選擇中文系列的字符編碼。尤其是UTF-8編碼,UTF系列中文字符編碼在實(shí)際中比較常用,使用這種編碼會(huì)降低亂碼出現(xiàn)機(jī)率。

      2Java Web的編碼及轉(zhuǎn)換機(jī)制

      2.1Unicode與常用編碼之間的直接轉(zhuǎn)換

      Unicode與GB2312/GBK、UTF-8都是中文字符編碼。轉(zhuǎn)換時(shí)有轉(zhuǎn)換規(guī)則,都是通過(guò)字節(jié)轉(zhuǎn)換為字符串,區(qū)別是每個(gè)漢字轉(zhuǎn)換成的字節(jié)數(shù)不同。圖1所示是在中文系統(tǒng)中常用編碼之間的轉(zhuǎn)換關(guān)系,需要Unicode編碼輔助完成編碼轉(zhuǎn)換,了解中文系統(tǒng)常用編碼轉(zhuǎn)化規(guī)則就可以避免亂碼問(wèn)題。

      2.2編碼轉(zhuǎn)換機(jī)制

      為了使Java語(yǔ)言開(kāi)發(fā)的Web應(yīng)用程序可以在各種平臺(tái)下無(wú)限制運(yùn)行,Java內(nèi)部規(guī)定統(tǒng)一使用Unicode字符編碼來(lái)表示字符集,Java源程序根據(jù)操作系統(tǒng)默認(rèn)的編碼方式完成轉(zhuǎn)碼,最終轉(zhuǎn)化成UTF-8編碼形式寫(xiě)入.class文件中。例如操作系統(tǒng)默認(rèn)GBK編碼,編譯時(shí)要將GBK編碼先與Unicode編碼進(jìn)行轉(zhuǎn)換,然后轉(zhuǎn)換成UTF-8格式寫(xiě)入.class文件中。按照這樣的轉(zhuǎn)換方式就不容易在中文系統(tǒng)中出現(xiàn)亂碼。若在英文系統(tǒng)中采用ISO-8859-1編碼轉(zhuǎn)化就不會(huì)出現(xiàn)亂碼現(xiàn)象。如圖2將簡(jiǎn)單描述Java源程序編碼的轉(zhuǎn)換流程。

      3Java Web應(yīng)用開(kāi)發(fā)中常見(jiàn)亂碼形式及成因

      當(dāng)Java Web技術(shù)應(yīng)用在JSP動(dòng)態(tài)網(wǎng)站開(kāi)發(fā)過(guò)程中,最容易出現(xiàn)亂碼現(xiàn)象,比如Jsp頁(yè)面顯示亂碼、用戶(hù)提交數(shù)據(jù)出現(xiàn)亂碼現(xiàn)象、數(shù)據(jù)庫(kù)出現(xiàn)亂碼現(xiàn)象等。

      3.1JSP頁(yè)面訪問(wèn)出現(xiàn)亂碼問(wèn)題

      基于Java Web技術(shù)開(kāi)發(fā)應(yīng)用程序,訪問(wèn)JSP頁(yè)面或Servlet 產(chǎn)生的頁(yè)面時(shí),在本該出現(xiàn)中文字符的地方出現(xiàn)亂碼,可能存在兩個(gè)原因:一是瀏覽器的顯示問(wèn)題;二是后臺(tái)代碼執(zhí)行出來(lái)的程序內(nèi)容就是亂碼。瀏覽器有問(wèn)題,需要著重設(shè)置JSP或者Servlet屬性。開(kāi)發(fā)工具的字符編碼出現(xiàn)問(wèn)題是由于使用的Eclipse、Tomcat編程軟件默認(rèn)輸出的字符是適用于英文系統(tǒng)的ISO-8859-1編碼,若編譯時(shí)沒(méi)有更改,就容易產(chǎn)生亂碼。

      運(yùn)行環(huán)境影響正常的編譯操作,操作系統(tǒng)版本不同,操作系統(tǒng)默認(rèn)編碼與所安裝的系統(tǒng)版本不一致,若將編譯好的.class文件植入一些不支持運(yùn)行的操作系統(tǒng)就會(huì)編碼沖突,產(chǎn)生亂碼。針對(duì)該種情況,開(kāi)發(fā)人員多會(huì)在不同版本的操作系統(tǒng)上,用記事本工具創(chuàng)建網(wǎng)頁(yè)源碼文件來(lái)避免亂碼,也可以用指令指明字符編碼的方式來(lái)避免瀏覽器本身的字符編碼與代碼中的字符編碼不一致所導(dǎo)致的中文亂碼現(xiàn)象。

      3.2用戶(hù)提交表單數(shù)據(jù)亂碼問(wèn)題

      用戶(hù)提交表單數(shù)據(jù)時(shí)出現(xiàn)亂碼,原因是在Request對(duì)象獲取用戶(hù)提交數(shù)據(jù)的中文信息后,由于Request對(duì)象對(duì)瀏覽器提交的中文解碼不正確,導(dǎo)致輸出出現(xiàn)亂碼??梢栽诮邮沼脩?hù)提交的表單信息的JSP文件或者Servlet文件中正確設(shè)置response.setCharacterEncoding參數(shù),同時(shí)將客戶(hù)端請(qǐng)求編碼設(shè)置轉(zhuǎn)換成瀏覽器編碼。在響應(yīng)頁(yè)面上,提倡正確使用response.setCharacterEncoding(“UTF-8”),正確設(shè)置編碼方式以避免亂碼現(xiàn)象。

      3.3訪問(wèn)數(shù)據(jù)庫(kù)出現(xiàn)亂碼問(wèn)題

      當(dāng)應(yīng)用程序通過(guò)JDBC向數(shù)據(jù)庫(kù)寫(xiě)入或者讀取數(shù)據(jù)時(shí),傳入數(shù)據(jù)庫(kù)的數(shù)據(jù)多數(shù)以中文編碼形式存在,而Java應(yīng)用程序與數(shù)據(jù)庫(kù)傳遞數(shù)據(jù)操作時(shí),是以ISO-8859-1編碼為默認(rèn)編碼,這時(shí)會(huì)因編碼沖突導(dǎo)致亂碼。

      4Java Web應(yīng)用開(kāi)發(fā)中亂碼問(wèn)題解決方案

      4.1JSP頁(yè)面訪問(wèn)出現(xiàn)亂碼問(wèn)題解決方案

      JSP頁(yè)面訪問(wèn)出現(xiàn)亂碼問(wèn)題是應(yīng)用開(kāi)發(fā)過(guò)程中最普遍、復(fù)雜性較低的一種亂碼問(wèn)題,開(kāi)發(fā)人員為了避免這種現(xiàn)象,通常在JSP頁(yè)面部首添加:

      <% pageEncoding="UTF-8"%>。

      有時(shí)也會(huì)對(duì)軟件本身進(jìn)行設(shè)置,一般會(huì)將Eclipse中工作空間的字符編碼設(shè)置為UTF-8編碼。而Tomcat,要先找到Server.xml配置文件,找到如下代碼,在代碼的末端加入U(xiǎn)RIEncoding=”UTF-8”,再重新啟動(dòng)Tomcat服務(wù)器,就能解決問(wèn)題。

      4.2用戶(hù)提交表單數(shù)據(jù)亂碼問(wèn)題解決方案

      在Servlet中,只對(duì)Request設(shè)置參數(shù)無(wú)法正確判斷解析URL中傳遞來(lái)的數(shù)據(jù)參數(shù),為了進(jìn)一步判斷和解決該情況的亂碼問(wèn)題,在用戶(hù)提交表單數(shù)據(jù)出現(xiàn)亂碼問(wèn)題時(shí),開(kāi)發(fā)人員通常選擇在Servlet中添加:

      String str=new String(request.get Parameter(“參數(shù)名”).getBytes(“ISO-8859-1”,“UTF-8”);

      提交的數(shù)據(jù)要通過(guò)HTTP的實(shí)體內(nèi)容發(fā)送給服務(wù)器,服務(wù)器接收時(shí)對(duì)Request設(shè)置正確的解碼方式,以免出現(xiàn)亂碼現(xiàn)象。

      4.3訪問(wèn)數(shù)據(jù)庫(kù)出現(xiàn)亂碼現(xiàn)象解決方案

      訪問(wèn)數(shù)據(jù)庫(kù)出現(xiàn)亂碼現(xiàn)象也是與字符編碼轉(zhuǎn)換有關(guān),在解決該問(wèn)題時(shí),首先要確定JSP/Servlet與數(shù)據(jù)庫(kù)采用的都是統(tǒng)一的中文編碼,然后明確數(shù)據(jù)庫(kù)中的中文數(shù)據(jù)正常,最后在MySQL中,使用配置向?qū)гO(shè)置數(shù)據(jù)庫(kù)將UTF-8編碼設(shè)置成默認(rèn)的連接對(duì)象。

      jdbc:mysql://localhost:3306/db1user=root&password=123456& useUnicode=true&characterEncoding=UTF-8

      5過(guò)濾器解決亂碼問(wèn)題

      采用過(guò)濾器解決實(shí)際項(xiàng)目中出現(xiàn)的亂碼問(wèn)題,對(duì)于Java Web開(kāi)發(fā)應(yīng)用,過(guò)濾器主要用于過(guò)濾、攔截請(qǐng)求和響應(yīng)信息。可以在Servlet過(guò)濾器或JSP頁(yè)面運(yùn)行之前和之后自動(dòng)調(diào)動(dòng),Servlet過(guò)濾器能夠?qū)ervlet容器的請(qǐng)求和響應(yīng)進(jìn)行檢查和修改。通過(guò)在web.xml文件中配置過(guò)濾器和編寫(xiě)實(shí)現(xiàn)過(guò)濾器功能代碼來(lái)處理亂碼問(wèn)題。

      EncodingFilter com.util.MyFilter encoding utf-8 EncodingFilter /*

      在filter配置中,指定初始化參數(shù)字符編碼encoding的值為UTF-8,filter類(lèi)中讀入該參數(shù)的值,并把resquest的字符編碼、response的字符編碼設(shè)置為encoding。過(guò)濾器處理亂碼的實(shí)現(xiàn)編碼如下:

      public void doFilter(ServletRequest request,ServletRequest response) throws IOException,ServletException{ String encoding=selectEncoding(request); if(encoding!=null) Request.setCharacterEncoding(encoding); chain.doFilter(request,response); }

      6結(jié)語(yǔ)

      研究結(jié)果表明,在Java Web技術(shù)開(kāi)發(fā)應(yīng)用中存在的幾種不同情況的亂碼問(wèn)題多數(shù)與字符編碼有關(guān),在程序編寫(xiě)過(guò)程中字符編碼設(shè)置不統(tǒng)一或正確的編碼轉(zhuǎn)換方式不正確,都會(huì)產(chǎn)生亂碼問(wèn)題。影響字符編碼的因素不僅與字符編碼自身的轉(zhuǎn)換標(biāo)準(zhǔn)有關(guān),還與軟件開(kāi)發(fā)環(huán)境以及開(kāi)發(fā)工具與Java輸出程序的字符編碼設(shè)置不一致有關(guān)。針對(duì)不同情況下發(fā)生的亂碼問(wèn)題,應(yīng)采取有效的解決辦法。

      參考文獻(xiàn):

      [1]賈文瀟,葉慧莉.Java Web開(kāi)發(fā)中的亂碼問(wèn)題[J].網(wǎng)絡(luò)與信息工程,2016(6):6264.

      [2]馮忠毅,董海棠,岳建斌,等.Java Web開(kāi)發(fā)中的亂碼問(wèn)題分析及解決方案研究[J].科技信息,2013(19):92,101.

      [3]周兵.Java Web開(kāi)發(fā)中的中文亂碼問(wèn)題分析及解決方案[J].電腦知識(shí)與技術(shù),2014(29):68846888.

      [4]張言輝.J2EE平臺(tái)下漢字亂碼問(wèn)題分析及解決[J].電腦知識(shí)與技術(shù):學(xué)術(shù)交流,2010(4X):30193021

      [5]楊金花.基于JSP技術(shù)中文亂碼的原因及解決方法[J].電子設(shè)計(jì)工程,2011(1):2528.〖

      (責(zé)任編輯:孫娟)

      猜你喜歡
      web技術(shù)
      基于物聯(lián)網(wǎng)的承壓特種設(shè)備管理系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
      基于Web技術(shù)的實(shí)驗(yàn)設(shè)備管理模式探索
      基于WEB的農(nóng)產(chǎn)品質(zhì)量追溯平臺(tái)的設(shè)計(jì)與實(shí)現(xiàn)
      營(yíng)銷(xiāo)互通平臺(tái)的分析
      基于Web的教學(xué)管理信息系統(tǒng)的開(kāi)發(fā)與實(shí)踐研究
      基于HTML5 web 技術(shù)APP快速開(kāi)發(fā)研究
      尚志市| 井陉县| 紫阳县| 扎鲁特旗| 咸宁市| 阳信县| 东莞市| 浮梁县| 尚志市| 吉木乃县| 东海县| 信阳市| 平凉市| 渝中区| 林甸县| 竹北市| 阳朔县| 三穗县| 潢川县| 东光县| 西乌珠穆沁旗| 广饶县| 苏尼特左旗| 黄石市| 靖江市| 巴楚县| 汾西县| 元谋县| 济南市| 阳朔县| 延津县| 琼结县| 仪陇县| 洮南市| 耿马| 苍山县| 大安市| 临沂市| 珠海市| 乃东县| 长寿区|