﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-benbenbaby-随笔分类-Java Basic Skills</title><link>http://www.blogjava.net/shakebaby/category/19890.html</link><description>不知就搜 不会就学</description><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 03:41:22 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 03:41:22 GMT</pubDate><ttl>60</ttl><item><title>“中文问题没商量”之Dom4j中的编码问题(转载)</title><link>http://www.blogjava.net/shakebaby/archive/2007/02/08/98781.html</link><dc:creator>shakebaby</dc:creator><author>shakebaby</author><pubDate>Thu, 08 Feb 2007 07:03:00 GMT</pubDate><guid>http://www.blogjava.net/shakebaby/archive/2007/02/08/98781.html</guid><wfw:comment>http://www.blogjava.net/shakebaby/comments/98781.html</wfw:comment><comments>http://www.blogjava.net/shakebaby/archive/2007/02/08/98781.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/shakebaby/comments/commentRss/98781.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/shakebaby/services/trackbacks/98781.html</trackback:ping><description><![CDATA[本文主要讲述的是Dom4j在把Document保存到文件过程中出现的一个中文问题,文中不足之处欢迎大家批评指教。<br />　　Dom4j是一个比较优秀的java开源xml解析项目，支持DOM, SAX and JAXP.，并提供对XPath查询语言的强大支持。因此，在EasyJF团队的很多开源项目中，如EasyJWeb、EasyDBO等都是使用Dom4j来处理xml文件相关操作。<br /> <br />1、从一个xml文件中载入一个Dom到内存：<br />　　FileInputStream in = new FileInputStream(new File(fileName));<br />　　SAXReader reader = new SAXReader();<br />　　doc = reader.read(in);<br />2、把Dom中的数据写入到xml文件中<br />　　使用Dom4j，要把一个Dom中的数据写入到文件非常简单，API如下：<br />　　 public void write(Writer writer) throws IOException；<br />　　因此，假如我们要把一个Document写入到c:\test.xml文件中，可以简单的使用下面的代码即可：<br />        java.io.Writer wr= new java.io.FileWrite(filename);<br />　　doc.write(wr);<br />        wr.close();//注意，必须要执行close()方法，才会实现真正的写入<br />　　<br />　　这种用法也是Dom4j所推荐我们使用的非常简单的方法。然而，当我们的dom中包含有中文字符数据的时候，这种方法写入的xml文档却无法使直觉打开。会提示类似如下的错误：<br />　　 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)<br /> at org.dom4j.io.SAXReader.read(SAXReader.java:484)<br /> at org.dom4j.io.SAXReader.read(SAXReader.java:343)<br /> at <br />　　我们可以看生成的xml文件编码，内容是utf-8的，但文件格式确是ANSI的，如下图所示：<br /><br /> <img height="409" alt="" src="http://www.128kj.com/UserFiles/Image/11559975301791157793070.jpg" width="567" twffan="done" /><br />原因分析：<br />　　由于FileWriter默认的输出编码是ANSI编码，而Dom4j中的wirte方法提供的内容实际是以UTF-8保存的，因此造成了包括中文字符的XML文件无法正常阅读。<br /> <br />解决方法：<br /> 　　不能使用简单的FileWriter，而应该是使用一个能指定具体输出编码的Writer，在JDK的io包中， OutputStreamWriter可以指定输出编码。<br />　　正确的代码如下：<br />    java.io.OutputStream out=new java.io.FileOutputStream(fileName);<br />   java.io.Writer wr=new java.io.OutputStreamWriter(out,"UTF-8");   <br />   doc.write(wr);   <br />   wr.close();<br />   out.close();<br /><br />　　简化一下可以写成下面的样式：<br /><br />   java.io.Writer wr=new java.io.OutputStreamWriter(new java.io.FileOutputStream(fileName),"UTF-8");   <br />   doc.write(wr);   <br />   wr.close();<br /><br />小结：<br />　　由于大多数优秀的基础性开源项目都是老外开发，他们不大可能在中文平台下进行测试，用例数据也很少会使用中文平台，因此，我们即使按照这些开源项目的通用说明文档及用户指南去操作，也会出现很多不可预知的错误。这也是为什么本人要参与组建开源团队EasyJF，提倡搞国产开源，并开发一些基础性的开源框架如EasyJWeb、EasyDBO的一个初衷。<br />　　当然，这里提出的中文问题，算是一个还“没来得及商量”以及要通过一些罕见的处理才能正确运行的中文问题。因此，同样归并到了“中文问题没商量”系列中。<br /><br />(注：本文作者,<a class="l2" href="http://www.easyjf.com/" target="_blank"><font color="#002c99">EasyJF开源团队</font></a>　<a class="l2" href="http://blog.csdn.net/easyjf" target="_blank"><font color="#002c99">大峡</font></a>，转载请保留作者声明！) <img src ="http://www.blogjava.net/shakebaby/aggbug/98781.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/shakebaby/" target="_blank">shakebaby</a> 2007-02-08 15:03 <a href="http://www.blogjava.net/shakebaby/archive/2007/02/08/98781.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>