Java处理带BOM的文本

Java处理带BOM的文本
 
说起BOM,这个问题还比较麻烦,因为BOM不可见,但用程序做不同编码文本处理时候却常常需要考虑到BOM的问题。在此之前,先对BOM做个简单认识。
 
先看看带BOM的文件:
源文件:
 
16进制打开:
 
 
 
下面举个例子,针对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 编码 。

参考资料:

1.        UTF-8, UTF-16, UTF-32 & BOM : http://www.unicode.org/faq/utf_bom.html#BOM
2.        XML FAQ Encoding http://www.opentag.com/xfaq_enc.htm
3.        Linux Unicode 编程: http://www.ibm.com/developerworks/cn/linux/i18n/unicode/linuni/
 
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值