快速业务通道

Java处理带BOM的文本 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-14

Java处理带BOM的文本

时间:2011-10-22 leizhimin

说起BOM,这个问题还比较麻烦,因为BOM不可见,但用程序做不同编码文本处理时候却常常需要考虑 到BOM的问题。在此之前,先对BOM做个简单认识。

先看看带BOM的文件:

源文件:

16进制打开:

Java处理带BOM的文本(2)

时间:2011-10-22 leizhimin

下面举个例子,针对UTF-8的文件BOM做个处理:

String xmla = StringFileToolkit.file2String(new File ("D:\\projects\\mailpost\\src\\a.xml"),"UTF-8"); byte[] b = xmla.getBytes("UTF- 8"); String xml = new String(b,3,b.length-3,"UTF-8"); Document doc1 =  DocumentHelper.parseText(xml); Element e1 = (Element)doc1.selectSingleNode ("/ResponseData/Body/RetDesc"); Element e2 = (Element)doc1.selectSingleNode ("/ResponseData/Head/RespID"); Element e3 = (Element)doc1.selectSingleNode ("/ResponseData/Body/RetCode"); Element e4 = (Element)doc1.selectSingleNode ("/ResponseData/Body/RetDesc");

思路是:先按照UTF-8编码读取文件后,跳过前三个字符,重新构建一个新的字符串,然后用Dom4j解 析处理,这样就不会报错了。

其他编码的方式处理思路类似,其实可以写一个通用的自动识别的BOM的工具,去掉BOM信息,返回字 符串。

不过这个处理过程已经有牛人解决过了:http://koti.mbnet.fi/akini/java/unicodereader/

什么是BOM

BOM(byte-order mark),即字节顺序标记,它是插入到以UTF-8、UTF16或UTF-32编码Unicode文件开 头的特殊标记,用来识别Unicode文件的编码类型。对于UTF-8来说,BOM并不是必须的,因为BOM用来标记 多字节编码文件的编码类型和字节顺序(big-endian或little-endian)。 

在绝大多数编辑器中都看不到BOM字符,因为它们能理解Unicode,去掉了读取器看不到的题头信息。 若要查看某个Unicode文件是否以BOM开头,可以使用十六进制编辑器。下表列出了不同编码所对应的BOM 。 

BOM Encoding
EF BB BF UTF-8
FE FF UTF-16 (big-endian)
FF FE UTF-16 (little-endian)
00 00 FE FF UTF-32 (big-endian)
FF FE 00 00 UTF-32 (little-endian)

BOM的来历

为了识别 Unicode 文件,Microsoft 建议所有的 Unicode 文件应该以 ZERO WIDTH NOBREAK SPACE( U+FEFF)字符开头。这作为一个“特征符”或“字节顺序标记(byte-order mark,BOM)”来识别文件中 使用的编码和字节顺序。

不同的系统对BOM的支持

因为一些系统或程序不支持BOM,因此带有BOM的Unicode文件有时会带来一些问题。

1.JDK1.5以及之前的Reader都不能处理带有BOM的UTF-8编码的文件,解析这种格式的xml文件时,会抛 出异常:Content is not allowed in prolog.

2.Linux/UNIX 并没有使用 BOM,因为它会破坏现有的 ASCII 文件的语法约定。

不同的编辑工具对BOM的处理也各不相同。使用Windows自带的记事本将文件保存为UTF-8编码的时候, 记事本会自动在文件开头插入BOM(虽然BOM对UTF-8来说并不是必须的),但是editplus就不会这样做。

BOM与XML

XML解析读取XML文档时,W3C定义了3条规则:

1.如果文档中有BOM,就定义了文件编码;

2.如果文档中没有BOM,就查看XML声明中的编码属性;

3.如果上述两者都没有,就假定XML文档采用UTF-8编码。

出处http://lavasoft.blog.51cto.com/62575/331095

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号