隨筆 - 115  文章 - 481  trackbacks - 0
          <2006年8月>
          303112345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          常用鏈接

          留言簿(19)

          隨筆檔案(115)

          文章檔案(4)

          新聞檔案(1)

          成員連接

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

            本文主要講述的是Dom4j在把Document保存到文件過(guò)程中出現(xiàn)的一個(gè)中文問(wèn)題,本文跟《80前》一文一樣,以Spring項(xiàng)目無(wú)關(guān),請(qǐng)“春迷”們自重、沒(méi)事勿擾,文中不足之處歡迎大家批評(píng)指教。
            Dom4j是一個(gè)比較優(yōu)秀的java開(kāi)源xml解析項(xiàng)目,支持DOM, SAX and JAXP.,并提供對(duì)XPath查詢語(yǔ)言的強(qiáng)大支持。因此,在EasyJF團(tuán)隊(duì)的很多開(kāi)源項(xiàng)目中,如EasyJWeb、EasyDBO等都是使用Dom4j來(lái)處理xml文件相關(guān)操作。
          ?
          1、從一個(gè)xml文件中載入一個(gè)Dom到內(nèi)存
            FileInputStream in = new FileInputStream(new File(fileName));
            SAXReader reader = new SAXReader();
            doc = reader.read(in);
          2、把Dom中的數(shù)據(jù)寫(xiě)入到xml文件中
            使用Dom4j,要把一個(gè)Dom中的數(shù)據(jù)寫(xiě)入到文件非常簡(jiǎn)單,API如下:
             public void write(Writer writer) throws IOException;
            因此,假如我們要把一個(gè)Document寫(xiě)入到c:\test.xml文件中,可以簡(jiǎn)單的使用下面的代碼即可:
          java.io.Writer wr= new java.io.FileWrite(filename);
            doc.write(wr);
          ?wr.close();//注意,必須要執(zhí)行close()方法,才會(huì)實(shí)現(xiàn)真正的寫(xiě)入
            
            這種用法也是Dom4j所推薦我們使用的非常簡(jiǎn)單的方法。然而,當(dāng)我們的dom中包含有中文字符數(shù)據(jù)的時(shí)候,這種方法寫(xiě)入的xml文檔卻無(wú)法使直覺(jué)打開(kāi)。會(huì)提示類似如下的錯(cuò)誤:
             org.dom4j.DocumentException: invalid byte 1 of 1-byte UTF-8 sequence (0xb2) Nested exception: invalid byte 1 of 1-byte UTF-8 sequence (0xb2)
          ?at org.dom4j.io.SAXReader.read(SAXReader.java:484)
          ?at org.dom4j.io.SAXReader.read(SAXReader.java:343)
          ?at
            我們可以看生成的xml文件編碼,內(nèi)容是utf-8的,但文件格式確是ANSI的,如下圖所示:

          ?
          原因分析
            由于FileWriter默認(rèn)的輸出編碼是ANSI編碼,而Dom4j中的wirte方法提供的內(nèi)容實(shí)際是以UTF-8保存的,因此造成了包括中文字符的XML文件無(wú)法正常閱讀。
          ?
          解決方法:
          ?  不能使用簡(jiǎn)單的FileWriter,而應(yīng)該是使用一個(gè)能指定具體輸出編碼的Writer,在JDK的io包中, OutputStreamWriter可以指定輸出編碼。
            正確的代碼如下:
          java.io.OutputStream out=new java.io.FileOutputStream(fileName);
          ???java.io.Writer wr=new java.io.OutputStreamWriter(out,"UTF-8");???
          ???doc.write(wr);???
          ???wr.close();
          ???out.close();
            簡(jiǎn)化一下可以寫(xiě)成下面的樣式:
             java.io.Writer wr=new java.io.OutputStreamWriter(new java.io.FileOutputStream(fileName),"UTF-8");???
          ???doc.write(wr);???
          ???wr.close();

          小結(jié):
            由于大多數(shù)優(yōu)秀的基礎(chǔ)性開(kāi)源項(xiàng)目都是老外開(kāi)發(fā),他們不大可能在中文平臺(tái)下進(jìn)行測(cè)試,用例數(shù)據(jù)也很少會(huì)使用中文平臺(tái),因此,我們即使按照這些開(kāi)源項(xiàng)目的通用說(shuō)明文檔及用戶指南去操作,也會(huì)出現(xiàn)很多不可預(yù)知的錯(cuò)誤。這也是為什么本人要參與組建開(kāi)源團(tuán)隊(duì)EasyJF,提倡搞國(guó)產(chǎn)開(kāi)源,并開(kāi)發(fā)一些基礎(chǔ)性的開(kāi)源框架如EasyJWeb、EasyDBO的一個(gè)初衷。
            當(dāng)然,這里提出的中文問(wèn)題,算是一個(gè)還“沒(méi)來(lái)得及商量”以及要通過(guò)一些罕見(jiàn)的處理才能正確運(yùn)行的中文問(wèn)題。因此,同樣歸并到了“中文問(wèn)題沒(méi)商量”系列中。
          (注:本文作者,EasyJF開(kāi)源團(tuán)隊(duì) 大峽,轉(zhuǎn)載請(qǐng)保留作者聲明!)
          posted on 2006-08-21 10:00 簡(jiǎn)易java框架 閱讀(1419) 評(píng)論(1)  編輯  收藏

          FeedBack:
          # re: “中文問(wèn)題沒(méi)商量”之Dom4j中的編碼問(wèn)題  2007-09-28 11:00 同聲傳譯
          很好,很希望與貴公司建立一個(gè)很好的一個(gè)合作伙伴  回復(fù)  更多評(píng)論
            

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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 北辰区| 策勒县| 靖边县| 延边| 垦利县| 施秉县| 阜城县| 右玉县| 牙克石市| 永年县| 平山县| 马关县| 西林县| 江陵县| 南丰县| 高清| 新安县| 台南市| 绥芬河市| 鹤庆县| 柏乡县| 巴彦淖尔市| 仁布县| 金昌市| 甘泉县| 牟定县| 深州市| 黄浦区| 林口县| 沈阳市| 晋中市| 达尔| 临潭县| 阿勒泰市| 大荔县| 镇安县| 始兴县| 甘南县| 行唐县| 宝兴县| 宁国市|