xmlWriter 以UTF-8格式寫xml問題

dom4j中的XMLWriter提供以下幾種構造方法:

XMLWriter() 
XMLWriter(OutputFormat format) 
XMLWriter(OutputStream out) 
XMLWriter(OutputStream out, OutputFormat format) 
XMLWriter(Writer writer) 
XMLWriter(Writer writer, OutputFormat format) 

最簡單常用的可能是new XMLWriter(new FileWriter(...))這樣的形式。可如果你一旦這么用,就會造成編碼問題。由于dom4j對于文件編碼的選擇是用java本身類的處理方式(可以從源碼看到),這么寫就是采用FileWriter的處理方式,而FileWriter是不提供對編碼的處理的。于是會調用系統自身的編碼,比如用中文操作系統,編碼方式就是gbk,但是它默認的在文件頭寫上<?xml version="1.0" encoding="UTF-8"?>。
也就是說,他以當前操作系統的編碼保存文件,并且竟然自動添加文件頭為"utf-8"格式,這會導致很多程序無法讀取正確編碼,而且具有很差的移植性(比如在windows下開發,放到linux服務器下跑,畢竟一般linux服務器默認local都是utf-8)。

解決途徑一:

使用new XMLWriter(new FileOutputStream(...))方法

這樣做,因為dom4j默認使用utf-8編碼,即xml文件頭默認編碼方式,并且內容也會使用utf-8保存,這樣可以做到一致的編碼,不會出問題

解決途徑二:

使用new XMLWriter(new FileOutputStream(...), outputFormat)的構造方法

OutputFormat xmlFormat = OutputFormat.createPrettyPrint();
xmlFormat.setEncoding("utf-8");
XmLWriter writer = new XMLWriter(new FileOutputStream(...), xmlFormat);
writer.write(document);
writer.close();

如上,setEncoding可以設置存儲的文件編碼格式,createPrettyPrint是得到美化xml格式輸出。這樣的話,在不同的環境下可以獲得同樣的編碼讀寫,并且真正保證了文件標稱與實際編碼的一致性。

注意如果使用OutputFormat是為了設置文件編碼,那千萬別用 XMLWriter(new FileWriter(...), outputFormat)構造方法,因為如前面所說,FileWriter不會處理編碼,
所以即使你使用format.setEncoding("utf-8");他仍然不會使用utf-8編碼,而只是把文件頭指定為utf-8,這類似不使用outputFormat的情況。

以下為個人實踐代碼:

    /*** 輸出xml文件* * @param document* @param filePath* @throws IOException*/public static void writeXml(Document document, String filePath) throws IOException {File xmlFile = new File(filePath);XMLWriter writer = null;try {if (xmlFile.exists())xmlFile.delete();writer = new XMLWriter(new FileOutputStream(xmlFile), OutputFormat.createPrettyPrint());writer.write(document);writer.close();} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {if (writer != null)writer.close();}}
    @Testpublic void testXMLDoc() {try {String filePath = "E:/eXML.xml";Document document = XMLUtil.getDocument(filePath);Element root = null;document = XMLUtil.createDocument("vrvscript", "Class", "POLICY_BASE_LINE");root = document.getRootElement();root.addAttribute("P_ID", "12");root.addAttribute("StartPolicy", "1中文");root.addAttribute("PolicyVersion", "1.0");root.addAttribute("ScheduleMode", "6");root.addAttribute("ScheduleTime", "1:1:1");root.addAttribute("RuleHandle", "2");XMLUtil.writeXml(document, filePath);} catch (IOException e) {e.printStackTrace();}}

測試結果發現:當寫入的內容包含中文時產生的xml文件是UTF-8;但如果寫入的內容中不包含中文,僅包含ANSI字符,那么產生的xml文件就是ANSI

?

@Testpublic void testXMLDoc() {try {String filePath = "E:/eXML.xml";Document document = XMLUtil.getDocument(filePath);Element root = null;document = XMLUtil.createDocument("vrvscript", "Class", "POLICY_BASE_LINE");root = document.getRootElement();root.addAttribute("P_ID", "12");root.addAttribute("StartPolicy", "1");root.addAttribute("PolicyVersion", "1.0");root.addAttribute("ScheduleMode", "6");root.addAttribute("ScheduleTime", "1:1:1");root.addAttribute("RuleHandle", "2");XMLUtil.writeXml(document, filePath);} catch (IOException e) {e.printStackTrace();}}

?

轉載于:https://www.cnblogs.com/liaojie970/p/5280074.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/272203.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/272203.shtml
英文地址,請注明出處:http://en.pswp.cn/news/272203.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux線程(互斥鎖、條件)

線程概念&#xff1a; 典型的UNIX/Linux進程可以看成只有一個控制線程&#xff1a;一個進程在同一時刻只做一件事情。有了多個控制線程后&#xff0c;在程序設計時可以把進程設計成在同一時刻做不止一件事&#xff0c;每個線程各自處理獨立的任務。 進程是程序執行時的一個實例…

centos下防火墻設置

1、開啟防火墻 systemctl start firewalld2、開放指定端口firewall-cmd --zonepublic --add-port8888/tcp --permanent命令含義&#xff1a; --zone #作用域 --add-port1935/tcp #添加端口&#xff0c;格式為&#xff1a;端口/通訊協議 --permanent #永久生效&#xff0c;沒有…

linux網絡編程、socket編程

進程間通信&#xff1a; 特點&#xff1a;依賴于內核&#xff0c;造成缺陷——無法實現多機通信。 網絡&#xff1a; 地址&#xff1a;由IP地址&#xff08;IP地址是IP協議提供的一種統一的地址格式&#xff0c;它為互聯網上的每一個網絡和每一臺主機分配一個邏輯地址&#xf…

【Python】Python Mako模板使用

參考資料&#xff1a; Mako Templates for Python官網&#xff1a;http://www.makotemplates.org/ Python模板庫Mako的用法&#xff1a;http://my.oschina.net/u/877170/blog/290438 Mako 1.0.4 Documentation&#xff1a;http://docs.makotemplates.org/en/latest/usage.html#…

簡單的ftp服務器(客戶端、服務器端、socket)

查看本機IP地址&#xff1a; 127.0.0.1 服務器功能&#xff1a; 可以獲取服務器文件使用get指令可以展示服務器有哪些文件使用ls指令進入服務器某個文件夾使用指令cd文件夾名稱上傳本地文件到服務器&#xff0c;使用指令putpwd可以查看客戶端在當前服務器的位置 客戶端本地…

JavaScript 全局對象

JavaScript 全局對象 全局屬性和函數可用于所有內建的 JavaScript 對象。 頂層函數&#xff08;全局函數&#xff09; 函數描述decodeURI()解碼某個編碼的 URI。decodeURIComponent()解碼一個編碼的 URI 組件。encodeURI()把字符串編碼為 URI。encodeURIComponent()把字符串編碼…

Redis持久化方式~RDB 持久化和AOF 持久化

持久化 Redis 是內存型數據庫&#xff0c;為了保證數據在斷電后不會丟失&#xff0c;需要將內存中的數據持久化到硬盤上。 RDB 持久化 將某個時間點的所有數據都存放到硬盤上。 可以將快照復制到其它服務器從而創建具有相同數據的服務器副本。 如果系統發生故障&#xff0…

Linux文件和目錄權限筆記

查看文件或者目錄的權限命令&#xff1a;ls -al # -a 表示全部文件包含隱藏文件&#xff0c;-l 表示列出每個文件的詳細信息比如執行 ls -altotal 115drwxr--x--- 4 root root 4096 Oct 24 02:07 install.log格式說明&#xff1a;通過 ls -al 格式化輸出的文件詳細信息&#x…

python基礎:序列(列表、元組、字符串)、函數、字典、集合

Python語言運行環境&#xff1a; windowslinuxunixMacos等等 博客記錄內容&#xff1a; Python3的所有語法、面向對象思維、運用模塊進行編程、游戲編程、計算機仿真。 Python是什么類型的語言&#xff1a; Python是腳本語言&#xff0c;腳本語言(Scripting language)是電腦…

Redis 與 Memcached的區別

Redis 與 Memcached 兩者都是非關系型內存鍵值數據庫&#xff0c;主要有以下不同&#xff1a; 數據類型 Memcached 僅支持字符串類型&#xff0c;而 Redis 支持五種不同的數據類型&#xff0c;可以更靈活地解決問題。 數據持久化 Redis 支持兩種持久化策略&#xff1a;RDB…

python基礎(文件、異常、模塊、類、對象)

文件&#xff1a; 打開文件使用open函數&#xff0c;open()的第一個參數是&#xff1a;要打開文件的路徑&#xff0c;如果只傳入文件名那么將在當前文件下查找文件并打開。第二個參數是&#xff1a;文件的打開模式&#xff0c;其他參數都是默認的。文件的打開模式如下圖所示&a…

redis 和 memcached 的區別

redis 和 memcached 的區別 對于 redis 和 memcached 我總結了下面四點。現在公司一般都是用 redis 來實現緩存&#xff0c;而且 redis 自身也越來越強大了&#xff01; redis支持更豐富的數據類型&#xff08;支持更復雜的應用場景&#xff09;&#xff1a;Redis不僅僅支持簡…

樹莓派入門(樹莓派登錄的幾種方式)

什么是嵌入式&#xff1f; 嵌入式即嵌入式系統&#xff0c;IEEE&#xff08;美國電氣和電子工程師協會&#xff09;對其定義是用于控制、監視或者輔助操作機器和設備的裝置&#xff0c;是一種專用的計算機系統。國內普遍認同的嵌入式系統定義是以應用為中心&#xff0c;以計算…

git 如何刪除本地創建的倉庫(轉載自 https://segmentfault.com/q/1010000002996177?_ea=262685)...

可以先清除本地文件夾下的git文件&#xff0c;然后在重新初始化新建的git倉庫 //刪除文件夾下的所有 .git 文件 find . -name ".git" | xargs rm -Rf接著add&#xff0c;commit等操作即可轉載于:https://www.cnblogs.com/xiahl/p/5289266.html

mysql中SQL查詢優化方法總結

1.對查詢進行優化&#xff0c;應盡量避免全表掃描&#xff0c;首先應考慮在 where 及 order by 涉及的列上建立索引。 2.應盡量避免在 where 子句中對字段進行 null 值判斷&#xff0c;否則將導致引擎放棄使用索引而進行全表掃描&#xff0c;如&#xff1a;select id from t w…

Linux庫概念及相關編程(動態庫、靜態庫、環境變量)

分文件編程&#xff1a; 好處&#xff1a;分模塊編程思想&#xff0c;功能和責任劃分清楚便與調試&#xff0c;main函數簡潔&#xff0c;代碼易于閱讀。編程時頭文件有的是使用<>這個符號括起來的&#xff0c;有的是" "使用的是雙引號&#xff0c;使用尖括號括…

復利計算器

import java.util.Scanner;public class Fulijisuan {public static void main(String[] args) {// TODO Auto-generated method stubdouble F0;double singlesum0;double doublesum0;double m0;Scanner scanner new Scanner(System.in);System.out.println("1:復利計算\n…

kali掃描內網ip_Metasploit路由轉發實現內網滲透

利用背景在滲透的過程中常常會遇到這種場景&#xff1a;我們已經通過web滲透拿下一臺內網服務器&#xff0c;為了進一步進行內網滲透&#xff0c;我們會利用“淪陷主機”作為跳板進行進一步的內網滲透&#xff0c;擴大戰果。現在假設的場景是此時我們已經拿下一臺內網服務器的遠…

.NET Core 3.0 中的新變化

譯者&#xff1a;楚人Leo譯文&#xff1a;http://www.cnblogs.com/leolion/p/10585834.html原文&#xff1a;https://msdn.microsoft.com/en-us/magazine/mt848631.aspx.NET Core 3.0 是 .NET Core 平臺的下一主要版本。本文回顧 .NET Core 發展歷史&#xff0c;并展示了它是如…