说起BOM,这个疑问还比拟费事,由于BOM不可见,但用顺序做不一样编码文本处置时分却经常须要思索到BOM的疑问。在此之前,先对BOM做个容易见解。
先看看带BOM的文件:
源文件:
![Java处理带BOM的文本[多图]图片1](/Files/BeyondPic/2010-7/22/1072201434284477.png)
16进制翻开:
![Java处理带BOM的文本[多图]图片2](/Files/BeyondPic/2010-7/22/1072201434226294.png)
检查原图(大图)
下面举个例子,针对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
读库教程网文章由网络收集后整理发布,文章发布人拥有该内容的所有权力及责任!
如果你喜欢这页,可以按Ctrl+D收藏起来。







