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 就不会这样做。

BOMXML

XML 解析读取 XML 文档时, W3C 定义了 3 条规则:
1.         如果文档中有 BOM ,就定 了文件 编码
2.         如果文档中没有 BOM ,就 XML 声明中的 编码 属性;
3.         如果上述两者都没有,就假定 XML 文档采用 UTF-8 编码


本文转自 leizhimin 51CTO博客,原文链接:http://blog.51cto.com/lavasoft/331095,如需转载请自行联系原作者
相关文章
|
7月前
|
安全 Java Spring
【Java用法】Java 过滤html标签获取纯文本信息
【Java用法】Java 过滤html标签获取纯文本信息
123 0
|
5月前
|
Java
Java文本进度条
Java文本进度条
|
3月前
|
Java Maven
java获取文件编码,jsoup获取html纯文本
java获取文件编码,jsoup获取html纯文本
14 0
|
4月前
|
算法 C++ Python
Java每日一练(20230430) 文本左右对齐、素数和、整数转英文表示
Java每日一练(20230430) 文本左右对齐、素数和、整数转英文表示
29 0
Java每日一练(20230430) 文本左右对齐、素数和、整数转英文表示
|
4月前
|
Java
Java PDF 相关 1、拷贝多个PDF到一个PDF,并且文件大小变小,文本等信息保留
1、合并多个PDF,并且文件变小,后面添加的文本信息保留
29 0
|
9月前
|
存储 Java
探索Java String:优雅处理文本数据
在Java编程世界中,字符串(String)是一种常见的数据类型,用于存储文本信息。字符串的处理在实际开发中经常涉及到循环操作,以便逐个处理字符串中的字符。本文将带您深入了解Java中对字符串的循环处理,包括循环遍历字符、字符串拼接、字符串分割等操作,助您优雅处理文本数据。
|
5月前
|
Java
Java读取文本文件的不同方式
Java读取文本文件的不同方式
63 1
|
6月前
|
安全 Java
Java读取文本文件
Java读取文本文件
|
7月前
|
自然语言处理 Java 关系型数据库
JSP文本相似性比较系统myeclipse开发mysql数据库web结构计算机java编程
JSP文本相似性比较系统是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发,采用两种比较常见的文本检测对比方法 编辑距离 和 余弦定理。
34 0
|
9月前
|
Java
Java IO流--使用缓冲流实现非文本文件和文本文件的复制
Java IO流--使用缓冲流实现非文本文件和文本文件的复制
106 0