熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

JDom輸出UTF-8的XML完美解決

2013-11-23 19:33:18  來源: Java核心技術 

  現象描述JDom輸出Xml文件當使用字符編碼GBK時正常而輸出UTF時亂碼

  完美的解決方法從辟謠開始
    )JDOM是否生成UTF的文件與Format是否設置無關只有輸出其他字符編碼才需要設置見下面的注釋
    )JDOM輸出UTF文件亂碼的根本原因並非在JDOMAPI而是在JDK

  具體描述
        JDOM的輸出類XMLOutputter有兩個output接口除了都具有一個Document參數外分別接受Writer和OutputStream參數
        這給我們一個錯覺兩個接口可以任意使用
        首先我們用output(docSystemout)來做測試此時得到亂碼
          然後我們改為output(docnew PrintWriter(Systemout))來測試輸出不是亂碼
          也就是說在控制台的時候一定要用一個Writer接口包裝一下
        然後我們用output(docnew FileWriter(path))來做測試結果卻得到亂碼
          然後我們改為output(docnew FileOutputStream(path))來測試輸出不是亂碼
          也就是說在輸出文件的時候一定要用一個OutputStream接口包裝一下
        瘋了吧?呵呵很搞笑是吧經過到JDOM的源碼中調試發現沒有任何問題問題出在了JDK裡面

  JDK內的對應接口處理
    )PrintWriter類有參數為OutputStream的構造方法因此可以從Systemout包裝到PrintWriter
    )FileWriter類沒有參數為OutputStream的構造方法因此不能從FileOutputStream包裝到FileWriter
    )如果PrintWriter類用了參數為Writer的構造方法(Writer實現為FileWriter)最後輸出也是亂碼
    )如果用一個FileOutputStream來包裝一個控制台輸出也是亂碼
    因此對於JDK內的各種輸出體系各種InputStreamOutputStreamreader和writer要充分認識否則極容易出現一些意想不到的問題

  測試的JDOM版本
    測試代碼

  

  import javaioFile;

  import javaioFileOutputStream;

  import javaioFileWriter;

  import javaioPrintWriter;

  import javautilHashMap;

  import orgjdomDocument;

  import orgjdomElement;

  import orgjdomoutputFormat;

  import orgjdomoutputXMLOutputter;

  public class BuildXML {

  public static void main(String[] args) throws Exception{

  File xmlfile=new File(C:\\EditTemp\\xml\\abcxml);

  //中文問題 //GBK 是沒有問題的但UTF就是有問題的

  //原因

  //)對於磁盤文件必須使用輸出流 FileOutputStream

  //     FileWriter out=new FileWriter(xmlfile);會導致亂碼

  //)對於控制台輸出則必須使用PrintWriter如果直接使用Systemout也會出現亂碼

  //     PrintWriter out=new PrintWriter(Systemout);

  FileOutputStream out=new FileOutputStream(xmlfile);

  Element eroot=new Element(root);

  erootaddContent((new Element(code))addContent(代碼));

  erootaddContent((new Element(ds))addContent(數據源));

  erootaddContent((new Element(sql))addContent(檢索sql));

  erootaddContent((new Element(order))addContent(排序));

  Document doc=new Document(eroot);

  XMLOutputter outputter = new XMLOutputter();

  //如果不設置format僅僅是沒有縮進xml還是utf因此format不是必要的

  Format f = FormatgetPrettyFormat();

  //fsetEncoding(UTF);//default=UTF

  outputtersetFormat(f);

  outputteroutput(doc out);

  outclose();

  }

  }


From:http://tw.wingwit.com/Article/program/Java/hx/201311/27086.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.