隨筆 - 312, 文章 - 14, 評(píng)論 - 1393, 引用 - 0
          數(shù)據(jù)加載中……

          Struts1.x系列教程(3):屬性(資源)文件亂碼問(wèn)題的解決之道

          本文為原創(chuàng),如需轉(zhuǎn)載,請(qǐng)注明作者和出處,謝謝!

          Struts 2系列教程》
             

          上一篇:Struts1.x系列教程(2):簡(jiǎn)單的數(shù)據(jù)驗(yàn)證

              資源文件不僅僅需要保存英文信息,在很多時(shí)候,也需要保存其他的語(yǔ)言信息,如中文信息。但Java的屬性文件只支持英文,要想在屬性文件中保存中文,需要使用"uxxxx格式,但這非常不方便,因此,本文將分別介紹如何使用native2ascii.exeEclipse插件的方式來(lái)解決這個(gè)問(wèn)題。

          一、使用native2ascii命令使資源文件支持中文
              從上篇文章中的ErrorDescription.properties文件中可以看到所有的錯(cuò)誤提示信息都是英文的。在客戶端顯示這些英文信息沒(méi)有任何問(wèn)題。但如果將這些英文錯(cuò)誤提示信息改成相應(yīng)的中錯(cuò)誤提示信息又會(huì)如何呢?
             
          在修改之前,先讓我們選中ErrorDescription.properties文件,單擊右鍵,在右鍵菜單中選擇【Properties】菜單項(xiàng),打開(kāi)屬性設(shè)置對(duì)話框,在右側(cè)所列的項(xiàng)目中選擇【Resource】??匆幌掠蚁陆堑?#8220;Text file encoding”的編碼格式,如果編碼格式不是UTF-8GBK(也包括GB2312、GB18030),請(qǐng)將編碼格式修改為UTF-8GBK,否則無(wú)法使用MyEclipse的屬性編輯器輸入中文。在設(shè)置完屬性文件的編碼格式后,將ErrorDescription.properties文件的內(nèi)容按著該文件的英文版所示修改成中文提示信息。

          中文版的ErrorDescription.properties

            error.user.blank = 用戶名不能為空.
            error.password.blank 
          = 密碼不能為空.
            error.password1.confirmation 
          = 密碼不匹配.
            error.email.blank 
          = Email不能為空
            error.email.invalid 
          = 不是一個(gè)正確的email地址

          重新啟動(dòng)Tomcat后,在IE中輸入如下的URL

          http://localhost:8080/samples/simpleValidation.jsp

          當(dāng)出現(xiàn)信息輸入界面后,點(diǎn)擊“提交”按鈕,將會(huì)顯示如圖1的效果。



          圖1

          也許很多讀者會(huì)感到奇怪。我們已經(jīng)將屬性文件的編碼格式修改為UTF-8GBK了,而且所輸入的中文在MyEclipse中也能正常顯示,并且頁(yè)面中的設(shè)置的編碼格式也和屬性文件中的編碼格式一致,那么為什么會(huì)輸出亂碼呢?
             
          產(chǎn)生這個(gè)問(wèn)題的原因要從Java對(duì)各種類(lèi)型的文件的處理方式上說(shuō)起。Java在處理*.java文件時(shí),無(wú)論*.java文件的編碼格式是UTF-8還是GBK。在使用javac.exe編譯時(shí),都會(huì)將其轉(zhuǎn)換成UCS-2編碼格式。因此,*.java文件就不會(huì)出現(xiàn)亂碼。而Java在處理屬性文件時(shí),只能處理ISO 8859-1(也稱為latin-1或“西歐語(yǔ)言”)UCS-2\uxxxx格式)編碼格式。因此,如果在屬性文件中含有其他編碼格式的字符,如GBK,Java仍然會(huì)按著ISO 8859-1編碼格式來(lái)解釋這些字符(如果遇到以"u開(kāi)頭的字符,就會(huì)按著UCS-2編碼格式處理),所以就會(huì)出現(xiàn)圖1所示的顯示效果。
              解決這個(gè)問(wèn)題的方法也很簡(jiǎn)單,在
          JDK中提供了一個(gè)native2ascii.exe命令(在<JDK安裝目錄>"bin目錄中),這個(gè)命令用來(lái)將屬性文件中的非ISO 8859-1格式的字符轉(zhuǎn)換成\uxxxx格式的UCS-2編碼格式。如按GBK編碼的“用戶”就會(huì)被轉(zhuǎn)換成UCS-2編碼格式的“\u7528\u6237
             
          我們可以使用如下的命令轉(zhuǎn)換ErrorDescription.properties文件的編碼格式:

              <JDK
          安裝目錄>\bin\native2ascii ErrorDescription.properties ErrorDescription.properties


             
          使用上面的命令將覆蓋舊的ErrorDescription.properties文件,如果讀者想保留舊的屬性文件,可以將native2ascii.exe的第二個(gè)命令行參數(shù)換成其他的文件名,如下面命令所示:

              <JDK
          安裝目錄>\bin\native2ascii ErrorDescription.properties newDescription.properties

          下面的內(nèi)容顯示了ErrorDescription.properties文件被轉(zhuǎn)換了編碼格式后的內(nèi)容:

          被轉(zhuǎn)換了編碼格式后的ErrorDescription.properties

          error.user.blank = \u7528\u6237\u540d\u4e0d\u80fd\u4e3a\u7a7a.
          error.password.blank 
          = \u5bc6\u7801\u4e0d\u80fd\u4e3a\u7a7a.
          error.password1.confirmation 
          = \u5bc6\u7801\u4e0d\u5339\u914d.
          error.email.blank 
          = Email\u4e0d\u80fd\u4e3a\u7a7a
          error.email.invalid 
          = \u4e0d\u662f\u4e00\u4e2a\u6b63\u786e\u7684email\u5730\u5740

              按著上面所述的方式運(yùn)行程序(需要重啟Tomcat或重新發(fā)布samples程序,以便對(duì)屬性文件的修改生效),就會(huì)得到如圖2所示的顯示效果。



          圖2
          二、使用Eclipse插件編輯屬性文件


             
          雖然上面的方法可以很好的解決Java屬性文件的亂碼問(wèn)題,但是這種方式并不方便。因此,每次修改屬性文件后,都要使用native2ascii.exe命令對(duì)被修改的屬性文件進(jìn)行編碼轉(zhuǎn)換。在本節(jié)將介紹兩個(gè)專門(mén)用來(lái)編輯Java屬性文件的Eclipse插件。通過(guò)使用這兩個(gè)插件,可以無(wú)需使用native2ascii.exe命令就可以很好地處理非ISO 8859-1編碼格式的字符。

          1. Properties Editor
          插件

              這個(gè)插件可以從http://sourceforge.jp/projects/propedit/下載。它分為三個(gè)版本:獨(dú)立運(yùn)行的版本、JBuilder版本和Eclipse版本。

          這個(gè)插件在編輯屬性文件時(shí)的方式和Eclipse內(nèi)嵌的屬性編輯器類(lèi)似。在下載插件壓縮包后,將其解壓,將featuresplugins兩個(gè)目錄復(fù)制到<MyEclipse安裝目錄>"eclipse目錄中即可。用Properties Editor插件編輯屬性文件的界面如圖3所示。



          圖3

          2. JInto插件


              這個(gè)插件可以從http://www.guh-software.de/jinto.html下載。它的基本功能和Properties Editor插件類(lèi)似,只是以表格形式編輯屬性文件,如圖4所示。



          圖4
              在使用上述兩個(gè)插件編輯完ErrorDescription.properties文件,并保存后,再使用Eclipse內(nèi)嵌的屬性編輯器打開(kāi)這個(gè)文件(選中屬性文件后,通過(guò)【Open With】選擇相應(yīng)的屬性文件編輯器,如圖5所示),就會(huì)看到"uxxxx格式的內(nèi)容。



          圖5

          這兩個(gè)插件都可以很好的滿足編輯屬性文件的需要,而且基本功能相同。讀者可以根據(jù)自己的喜好選擇使用其中的任何一個(gè)插件來(lái)編輯屬性文件。

          下一篇:
          Struts1.x系列教程(4):標(biāo)簽庫(kù)概述與安裝





          Android開(kāi)發(fā)完全講義(第2版)(本書(shū)版權(quán)已輸出到臺(tái)灣)

          http://product.dangdang.com/product.aspx?product_id=22741502



          Android高薪之路:Android程序員面試寶典 http://book.360buy.com/10970314.html


          新浪微博:http://t.sina.com.cn/androidguy   昵稱:李寧_Lining

          posted on 2009-01-14 12:36 銀河使者 閱讀(6733) 評(píng)論(3)  編輯  收藏 所屬分類(lèi): java 、web 原創(chuàng) 、struts1.x

          評(píng)論

          # re: Struts1.x系列教程(3):屬性(資源)文件亂碼問(wèn)題的解決之道  回復(fù)  更多評(píng)論   

          http://www.ourjavasky.cn java論壇
          2009-01-14 12:56 | ourjavasky

          # re: Struts1.x系列教程(3):屬性(資源)文件亂碼問(wèn)題的解決之道  回復(fù)  更多評(píng)論   

          "但Java的屬性文件只支持英文,要想在屬性文件中保存中文,需要使用"uxxxx格式,但這非常不方便"
          此言差矣!在jdk1.6里Properties.load()方法已經(jīng)不再是只能以InputStream的形式加載內(nèi)容,而是多了個(gè)Properties.load(Reader reader)的方法,這樣,你就可以把reader包裝一下,指定具體的字符集編碼,不再需要做uxxxx的轉(zhuǎn)換了
          2009-01-14 16:48 | kanine

          # re: Struts1.x系列教程(3):屬性(資源)文件亂碼問(wèn)題的解決之道  回復(fù)  更多評(píng)論   

          也許新版本的jdk可以不使用\uxxxx格式,但并不是所有的開(kāi)發(fā)人員都使用最新的jdk,還有就是雖然新版本的jdk可以讀取其他格式的屬性文件,但有些框架可能并沒(méi)有使用這些功能,因此,使用Properties.load方法讀取屬性文件只能用在完全由自己控制的情況下,如果處理屬性文件的功能是其他人做的,而且還不能修改代碼,那就得聽(tīng)天由命了,完全取決于這個(gè)人是否使用了新功能來(lái)處理屬性文件。
          2009-01-14 18:50 | 銀河使者
          主站蜘蛛池模板: 龙山县| 巴南区| 修水县| 中西区| 怀化市| 策勒县| 黄陵县| 七台河市| 疏附县| 阿荣旗| 南木林县| 平湖市| 揭东县| 元谋县| 西吉县| 黔东| 苗栗县| 石柱| 重庆市| 贡觉县| 永州市| 名山县| 沂源县| 曲沃县| 申扎县| 郑州市| 永吉县| 康乐县| 长沙市| 嘉荫县| 亚东县| 盘山县| 垫江县| 康保县| 从化市| 正安县| 綦江县| 德钦县| 宜宾县| 商南县| 大荔县|