说起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");
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
编码
。
本文转自 leizhimin 51CTO博客,原文链接:http://blog.51cto.com/lavasoft/331095,如需转载请自行联系原作者