JDom输出UTF-8的XML完美解决方法

完美的解决方法从辟谣开始:

1)JDOM是否生成UTF-8的文件与Format是否设置无关,只有输出其他字符编码才需要设置,见下面的注释。

2)JDOM输出UTF-8文件乱码的根本原因并非在JDOMAPI,而是在JDK。

具体描述:

JDOM的输出类XMLOutputter有两个output接口,除了都具有一个Document参数外,分别接受Writer和OutputStream参数。

这给我们一个错觉,两个接口可以任意使用。

首先我们用output(doc,System.out)来做测试,此时得到乱码,

然后我们改为output(doc,new PrintWriter(System.out))来测试,输出不是乱码,

也就是说在控制台的时候一定要用一个Writer接口包装一下。

然后我们用output(doc,new FileWriter(path))来做测试,结果却得到乱码,

然后我们改为output(doc,new FileOutputStream(path))来测试,输出不是乱码,

也就是说在输出文件的时候一定要用一个OutputStream接口包装一下。

疯了吧?呵呵,很搞笑是吧。经过到JDOM的源码中调试,发现没有任何问题,问题出在了JDK里面。

JDK内的对应接口处理:

1)PrintWriter类有参数为OutputStream的构造方法,因此可以从System.out包装到PrintWriter

2)FileWriter类没有参数为OutputStream的构造方法,因此不能从FileOutputStream包装到FileWriter

3)如果PrintWriter类用了参数为Writer的构造方法(Writer实现为FileWriter),最后输出也是乱码

4)如果用一个FileOutputStream来包装一个控制台输出,也是乱码

因此,对于JDK内的各种输出体系,各种InputStream、OutputStream、reader和writer要充分认识,否则极容易出现一些意想不到的问题。

测试的JDOM版本:1.0、1.1

测试代码:

    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.FileWriter;
    import java.io.PrintWriter;
    import java.util.HashMap;
    import org.jdom.Document;
    import org.jdom.Element;
    import org.jdom.output.Format;
    import org.jdom.output.XMLOutputter;
    public class BuildXML {
     public static void main(String[] args) throws Exception{
      File xmlfile=new File("C:\\EditTemp\\xml\\abc.xml");
      //中文问题 //GBK 是没有问题的,但UTF-8就是有问题的
      //原因:
      //1)对于磁盘文件,必须使用输出流 FileOutputStream
      //     FileWriter out=new FileWriter(xmlfile);会导致乱码
      //2)对于控制台输出,则必须使用PrintWriter,如果直接使用System.out也会出现乱码
      //     PrintWriter out=new PrintWriter(System.out);
      FileOutputStream out=new FileOutputStream(xmlfile);
         Element eroot=new Element("root");
         eroot.addContent((new Element("code")).addContent("代码"));
         eroot.addContent((new Element("ds")).addContent("数据源"));
         eroot.addContent((new Element("sql")).addContent("检索sql"));
         eroot.addContent((new Element("order")).addContent("排序"));
         Document doc=new Document(eroot);
         XMLOutputter outputter = new XMLOutputter();
         //如果不设置format,仅仅是没有缩进,xml还是utf-8的,因此format不是必要的
         Format f = Format.getPrettyFormat();
         //f.setEncoding("UTF-8");//default=UTF-8
         outputter.setFormat(f);
         outputter.output(doc, out);
         out.close();
     }
    }

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索乱码
, utf-8
, import
, filewriter
, 输出
, java数据操作流乱码
, fileoutputstream
, PrintWriter
, 输出乱码
完美解决SQL
jdom 输出xml、jdom解析xml、jdom解析xml字符串、java jdom解析xml、jdom2解析xml,以便于您获取更多的相关知识。

时间: 2024-09-20 20:17:11

JDom输出UTF-8的XML完美解决方法的相关文章

Out of memory at line:2完美解决方法

今天小编打开网页跳出个对话框上面写着 out of memory at line:2,关闭浏览器 重开一下浏览器 一下子就好了 电脑之后也没变慢 很正常 原因分析:可能是虚拟内存不足导致的. 完美解决方法: 我的电脑 属性--高级--性能--选择设置--高级--虚拟内存--更改--在自定义大小--初始大小是你的内存大小,最大设置为你的内存大小的2倍(例如1g则设为最大值2g)即可

thinkphp多表查询两表有重复相同字段的完美解决方法_php技巧

框架:thinkphp 版本:3.2.3 内容:查询语句 解决问题:重复字段问题 $Data = M('a')->where($where) ->Field('a.name as aname,b.name as uname,a.*') ->join('b on b.jb_id=a.id') ->order('a.id desc') ->select(); 解释:a.* 查询a表所有的字段 a.name as aname 转换a表中的name重复字段为aname 以上就是小编为

Android判断软键盘弹出并隐藏的简单完美解决方法(推荐)_Android

最近项目中有一个编辑框,下面是个ListView.在触发编辑框弹出软键盘后,ListView还能滑动,并且ListView的item还能响应单击.这样的体验效果很不好.于是便想在滑动或单击item时判断键盘是否弹出,若弹出,则把它隐藏. 网上一搜,发现Android并没有直接提供软键盘的弹出与隐藏判断,一些解决方案诸如判断父控件的高度或者判断 if(getWindow().getAttributes().softInputMode==WindowManager.LayoutParams.SOFT

javascript小数精度丢失的完美解决方法_javascript技巧

原因:js按照2进制来处理小数的加减乘除,在arg1的基础上 将arg2的精度进行扩展或逆扩展匹配,所以会出现如下情况. javascript(js)的小数点加减乘除问题,是一个js的bug如0.3*1 = 0.2999999999等,下面列出可以完美求出相应精度的四种js算法 function accDiv(arg1,arg2){ var t1=0,t2=0,r1,r2; try{t1=arg1.toString().split(".")[1].length}catch(e){} t

JS模态窗口返回值兼容问题的完美解决方法_javascript技巧

因系统要兼容原IE已使用的关闭方法,经调试测得,需对window.dialogArguments进行再较验,不然易出问题. function OKEnd(vals) { if (vals == null) vals = "TRUE"; if (typeof (window.opener) == "undefined") { if (typeof (window.dialogArguments) != "undefined") { if (wind

jQuery ui autocomplete选择列表被Bootstrap模态窗遮挡的完美解决方法_jquery

最近在一个ASP.NET MVC5项目中使用Bootstrap的模态窗(弹出层)来让用户填写内容,其中的一个编辑框提供了自动完成功能,用jQuery UI Autocomplete来实现. 因为我是WEB前端小白,遇到一个问题很久也没解决掉,所以特简单记录一下,供以后查阅. 问题:不使用模态窗的时候,autocomplete可以很好的工作,使用模态窗时弹出的选择菜单会被模态窗遮挡. 解决过程: 首先查到的解决办法是在*autocomplete.css中找到.ui-autocomplete伪类,添

python 采集中文乱码问题的完美解决方法_python

近几日遇到采集某网页的时候大部分网页OK,少部分网页出现乱码的问题,调试了几日,终于发现了是含有一些非法字符造成的..特此记录 1. 在正常情况下..可以用 import chardet thischarset = chardet.detect(strs)["encoding"] 来获取该文件或页面的编码方式 或直接抓取页面的charset = xxxx 来获取 2. 遇到内容中有特殊字符时指定的编码一样会造成乱码..即内容中非法字符造成的,可以采用编码忽略非法字符的方式来处理. st

阻止表单提交按钮多次提交的完美解决方法_javascript技巧

如果表单是通过onsubmit进行Ajax提交,注意将表单提交按钮input type属性设为button,尽量不要设置为submit类型. 另外,在提交事件发出后,最好将提交按钮设置为disabled,防止由于网络延时问题,让用户有机会进行多次点击重复提交. onclick事件里面执行 $(this).attr('disabled','disabled'); 在点击一次后立马将按钮设置为不可使用. 或者向如下方法另行定义一个jQuery函数来进行控制: $("form").submi

跨域请求的完美解决方法(JSONP, CORS)_基础知识

一个众所周知的问题,Ajax直接请求普通文件存在跨域无权限访问的问题.解决方法有JSONP,Flash等等. JSONP 我们发现,Web页面上调用js文件时不受是否跨域的影响,凡是拥有"src"这个属性的标签都拥有跨域的能力,比如<script>.<img>.<iframe>.那就是说如果要跨域访问数据,就服务端只能把数据放在js格式的文件里.恰巧我们知道JSON可以简洁的描述复杂数据,而且JSON还被js原生支持,所以在客户端几乎可以随心所欲的处