今天倒腾了一下午的编码问题总报错
org.dom4j.DocumentException: Invalid byte 1 of 1-byte UTF-8 sequence. Nested exception: Invalid byte 1 of 1-byte UTF-8 sequence.
百度了好久终于找到了根源...
我们来看写文件时用到的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的情况。而网上好多人举例用了XMLWriter writer = new XMLWriter(new FileWriter("output.xml"),format);那是因为他们format.setEncoding("gbk");而windows默认就是gbk,这当然使实际编码与标称的配套了。但实际上,这种方法是不正确的,java并没有按你写的"gbk"进行编码,而是使用了系统默认编码而已,放到linux就会出现错误,所以一定的小心。
把编码交给操作系统来控制一向是罪恶的,包括java其他地方的参数传递等,如request的参数传递,其他文件读写,如果不使用编码过滤器,不进行编码指定,可能使得整个系统失去移植性,并产生完全不可预期的错误。找起来头大不说,有时候看到encoding="UTF-8",实际上却是gkb编码会让你错过关键调试点。
还有就是记事本的罪恶性,用记事本打开不同编码的文件,往往得不到预期的效果,而且你无从得知他到底是用何种编码打开,一般使用EditPlus指定编码打开会好很多。
相关推荐
通过MODBUS,我们可以读取和写入PLC的寄存器,包括输入寄存器(只读)和输出寄存器(读/写)。 2. **OPC UA**:这是一种更现代、更安全的通信标准,提供了一个统一的接口来访问不同厂商的自动化设备,包括PLC。使用...
- XML文件编码:确保读写的文件编码与XML文档一致,避免出现乱码问题。 - 错误处理:在读取和写入过程中,需要捕获可能出现的异常,例如文件不存在、格式错误等。 - 性能优化:如果XML文件非常大,考虑分块读取或...
- 确保处理XML时正确处理编码,避免乱码问题。 - 在修改XML内容时,务必确保找到的节点是存在的,否则会抛出异常。 - `XMLWriter`的输出格式可以根据需求调整,比如去掉空格和换行,或者使用紧凑格式。 DOM4J的...
解决Hadoop中文乱码问题的关键在于识别和匹配数据的正确编码,并在Hadoop组件和工具中设置相应的编码选项。在实际操作中,可能需要结合日志信息和源码调试来定位问题。同时,建立良好的编码规范,统一数据的编码格式...
`: 输出XML文档的声明部分,指定版本号为1.0,并使用UTF-8编码。 - **XML根元素**: - `echo "<menuitems>";`: 定义XML文档的根元素为`<menuitems>`。 #### 四、查询数据并生成XML元素 - **执行SQL查询**: - `...
当XML文件以UTF-16编码并包含BOM头时,DOM4J在解析过程中可能会遇到问题,因为DOM4J默认并不期望XML文档以这种方式开始。这可能导致解析异常,例如`org.dom4j.DocumentException: Incorrect byte order mark (BOM) ...
这里`source.xml`是待读取的XML文件,`root`是XML文档的根元素。 3. **查找指定结点**: 使用ElementTree API,我们可以根据结点的名称或属性来定位结点。例如,如果我们要找名为`node_name`的结点: ```python ...
本文将介绍如何使用PHP读取并输出XML文件中的数据,涵盖了载入、遍历、读取和输出XML数据的技术和操作技巧。 首先,我们需要有一个XML文件,该文件中存储了我们想要读取的数据。XML文件通常是以一种层级结构的方式...
然而,当XML文档中包含中文字符时,可能会出现乱码问题。本文将深入探讨如何使用Dom4j解析XML以及解决中文乱码的问题。 首先,让我们了解Dom4j的基本用法。在解析XML文件时,通常会使用`DocumentBuilderFactory`和`...
此外,确保输入和输出的中文字符串也是UTF-8编码,避免乱码问题。 在使用“xmlwriter中文版”时,可能需要注意的点是它是否包含了中文的示例代码、文档说明,以及是否对处理中文字符有任何特别优化。如果`HB_XML...
总结来说,这篇博客文章可能会涵盖如何使用Perl中的XML处理模块来读取、解析、修改和写入XML文件,同时强调了在处理中文字符时正确处理字符编码的重要性。学习这些技能对于在IT行业中处理XML数据是至关重要的。
例如,读取XML时可以设置编码参数,写入XML时可以指定输出的编码格式。在编码转换过程中,我们可能需要借助第三方库,如Java的ICU4J,Python的codecs模块等,来实现UTF-8与其他编码间的转换。 XML的编码问题不仅...
三、XML读取 1. QDomDocument使用:首先,我们需要使用QDomDocument加载XML文件,然后通过QDomElement和QDomNode接口遍历并访问XML结构。例如: ```cpp QFile file("example.xml"); if (file.open(QIODevice::...
总结来说,处理GBK编码的TXT文档在Android中涉及到使用特定的输入/输出流来处理非UTF-8编码的文件,确保正确读取和写入中文字符。通过上述步骤,你可以成功地在Android应用中实现GBK编码TXT文档的读取和保存功能。
4. 写入数据,如使用`Marshaller`对象将Java对象编码为XML,或使用Apache POI创建和填充Excel单元格。 5. 关闭输出流,保存文件。 在文件操作中,有时还需要执行删除操作。Java的`File`类提供了`delete()`方法,...
3. **write_xml()函数**:这个函数接收解析后的ElementTree对象和输出路径,然后使用`write()`方法将XML写回文件。`encoding`参数设置编码为UTF-8,`xml_declaration`参数确保XML声明被写入文件。 4. **if_match()...
- 注意:如果文档使用的是UTF-8编码,在Windows环境下输出可能会出现乱码问题,因为默认控制台编码为gb2312。 - **保存文档对象**: - `TiXmlDocument`还提供了`SaveFile`方法用于保存文档到新的文件。 ```cpp ...
而SAX解析则是事件驱动的,逐行读取文件,不创建完整的DOM树,适合处理大型XML文件。在这个案例中,我们提到的“xml解析还原代码”很可能采用了DOM解析方式,因为需要构建二叉树来存储数据。 接下来,我们将数据...
在处理XML文件时,我们还需要考虑到特殊字符的编码问题。比如文档中提到的"生成变量名('My-Number')",涉及到特殊字符的转义编码,如0x3A代表'-'和':'。 最后,MATLAB的XML工具箱也支持仅读取XML文件的根元素。这...