posts - 495,  comments - 11,  trackbacks - 0

            1、Java編譯器在對(duì)源文件編譯前,會(huì)先把源文件轉(zhuǎn)換為unicode編碼,因?yàn)檫@個(gè)原因,我們?cè)诰幾g時(shí)一定要把源文件用的是什么編碼方式正確無誤的”告訴”編譯器。

            例如:我們的源文件是以UTF-8的方式保存的,而在編譯時(shí)卻把它當(dāng)作是用GBK方式保存的,這樣編譯器就會(huì)按照GBK->Unicode的編碼轉(zhuǎn)換方法對(duì)源文件進(jìn)行轉(zhuǎn)換,然后再編譯,這樣當(dāng)然會(huì)出錯(cuò),實(shí)際上編譯器應(yīng)當(dāng)按照UTF-8->Unicode的編碼轉(zhuǎn)換方法來對(duì)源文件進(jìn)行轉(zhuǎn)換。

            a.對(duì)于控制臺(tái)程序,編譯器會(huì)把源文件看作是由系統(tǒng)默認(rèn)的編碼類型來編碼的(系統(tǒng)默認(rèn)的編碼類型取決于在控制面板區(qū)域設(shè)置里的配置,中文win2k下通常是GBK),也可以使用-encoding參數(shù)來設(shè)置,如:javac -encoding UTF-8,這樣編譯器就會(huì)把源文件看作是用UTF-8編碼的(這只是告訴編譯器源文件的編碼類型,而不是對(duì)源文件轉(zhuǎn)碼)。在各種語(yǔ)言的平臺(tái)上只要在編譯用時(shí)-encoding指定與源文件的編碼相同的編碼方式,就不會(huì)存在國(guó)際化的問題了。

            b.對(duì)于JSP,編譯器則會(huì)根據(jù)設(shè)定的字符集來判斷JSP文件使用的是什么編碼方式,進(jìn)而將其轉(zhuǎn)換成unicode后進(jìn)行編譯;若JSP中未指定,編譯器則會(huì)把JSP文件看作是按照系統(tǒng)默認(rèn)的編碼來保存的。在JSP2.0里新增了一個(gè)指令來通知編譯器這個(gè)源文件所使用的編碼方式。

            2、在處理輸入輸出時(shí),注意設(shè)置輸入流和輸出流的編碼類型與用戶輸入時(shí)和輸出設(shè)備顯示時(shí)采用的編碼方式一致。

            由于JRE在處理輸入輸出時(shí)會(huì)將輸入或輸出的內(nèi)容進(jìn)行編碼轉(zhuǎn)換,對(duì)于輸入會(huì)轉(zhuǎn)換為unicode后再送入,因此要正確的匹配實(shí)際輸入內(nèi)容的編碼方式和告知JRE的編碼方式,對(duì)于輸出,會(huì)由unicode轉(zhuǎn)換為其他的編碼再送出程序,因此要正確匹配輸出設(shè)備顯示時(shí)用的編碼方式和告知JRE的編碼方式。

            例如:程序中設(shè)置輸入流的編碼是new InputStreamReader(System.in,"GB2312");而程序運(yùn)行后用戶輸入時(shí)用了繁體中文的輸入法,輸入了BIG5編碼的內(nèi)容,這樣JRE把BIG5編碼的內(nèi)容當(dāng)作GB2312的進(jìn)行了GB2312->unicode的編碼轉(zhuǎn)換,這樣轉(zhuǎn)換后的結(jié)果顯然不是用戶想要輸入的內(nèi)容了。

            默認(rèn)情況下,JRE會(huì)把輸入輸出的內(nèi)容當(dāng)作是按照系統(tǒng)默認(rèn)編碼方式編碼的。

            3、在Servlet中,除了一定要把源文件用的是什么編碼方式正確無誤的”告訴”編譯器外,還要注意實(shí)際提交的URL數(shù)據(jù)、表單數(shù)據(jù)的編碼格式和request中聲明的編碼格式一致。

            客戶端瀏覽器在通過表單和URL提交數(shù)據(jù)時(shí),容器和JVM會(huì)將request中的數(shù)據(jù)看作是按照request所聲明的編碼方式來編碼的,將數(shù)據(jù)由這種編碼方式轉(zhuǎn)換為unicode后再送入servlet(實(shí)際上容器會(huì)先將request中的數(shù)據(jù)轉(zhuǎn)為一種中間編碼方式,具體根據(jù)容器的配置而定,再由JVM由這種中間方式轉(zhuǎn)換為unicode,通常這種中間格式是ISO)。servlet輸出的unicode數(shù)據(jù)會(huì)由容器根據(jù)response中聲明的編碼方式進(jìn)行轉(zhuǎn)換,再送到客戶端瀏覽器上。

            在接收客戶端輸入時(shí),用request.setCharacterEncoding()聲明請(qǐng)求中數(shù)據(jù)的編碼方式。

            在向客戶端輸出時(shí)用response.setContentType("text/html;charset=");聲明響應(yīng)的數(shù)據(jù)的編碼方式,告知瀏覽器以哪種編碼方式顯示。

            4、在JSP中,由于JSP本就會(huì)被JSP編譯器編譯為servlet來運(yùn)行,因此情況與servlet相同。

            這兩個(gè)JSP指令聲明了請(qǐng)求和響應(yīng)的編碼方式。

            只要確保URL參數(shù)或表單中數(shù)據(jù)的編碼方式和所聲明的編碼方式一致,再通過告知JSP編譯器本JSP文件采用的編碼方式及含有哪種字符,即可解決JSP的字符編碼問題。

            這里是一個(gè)具體的例子:

            現(xiàn)在因?yàn)闉g覽器對(duì)UTF-8的支持,我們可以通過在源文件、請(qǐng)求、響應(yīng)中都使用unicode編碼方式,來輕松達(dá)到處理國(guó)際化和字符編碼問題的目標(biāo)。

            以我們使用的tomcat4.1.2為例,過程如下:

            1、編寫JSP頁(yè)面時(shí):在每個(gè)JSP頁(yè)面在頁(yè)首都要增加一行:

            在編輯JSP頁(yè)面時(shí),一定要確保JSP文件以u(píng)nicode的方式保存,目前幾乎所有的編輯器都有以u(píng)nicode編碼保存或?qū)⑽募?nèi)容轉(zhuǎn)換成unicode的功能。

            2、增加一個(gè)用來聲明request的CharacterEncoding的類SetCharacterEncodingFilter.java;

            SetCharacterEncodingFilter的這個(gè)類主要的作用就是:把request在從頁(yè)面剛提交到server端的時(shí)候的encoding聲明為我們想要的encoding,通過調(diào)用request的方法setCharacterEncoding (String encoding) 來改變,這樣可以使request的從客戶端傳過來的時(shí)候,按我們?cè)趙eb.xml (在第二點(diǎn)可以講到) 中配置的encoding來對(duì)提交的數(shù)據(jù)編碼。

            3、修改web.xml文件,配置一個(gè)filter來過濾全部url請(qǐng)求,通過第二步中的類,聲明所有url請(qǐng)求的編碼類型未UTF-8。

            在web.xml文件中加上以下這段:

            

          posted on 2007-11-03 16:43 jadmin 閱讀(60) 評(píng)論(0)  編輯  收藏

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 买车| 溧阳市| 枝江市| 门头沟区| 高雄市| 甘肃省| 梅河口市| 安多县| 临西县| 当涂县| 呼图壁县| 寿光市| 防城港市| 巴里| 临安市| 清原| 唐海县| 尤溪县| 余姚市| 泽州县| 育儿| 龙陵县| 兴宁市| 中方县| 孝感市| 舒城县| 印江| 始兴县| 安新县| 革吉县| 湖口县| 绥德县| 鸡东县| 康定县| 金秀| 清河县| 和顺县| 张北县| 永城市| 桑植县| 嘉禾县|