9/26/2006

用JAVA处理Unicode BOM

Unicode Byte-Order Markup(BOM)是一种字节序标记用来标示随后的字节流是何种Unicode,BOM有以下几种:
Bytes Encoding Form
00 00 FE FF UTF-32, big-endian
FF FE 00 00 UTF-32, little-endian
FE FF UTF-16, big-endian
FF FE UTF-16, little-endian
EF BB BF UTF-8
可以通过这里来获取详细的信息。

但是这些BOM并不是必须的,JAVA的Unicode编码可以处理UTF-16的两种BOM,但是对于UTF-8却无能为力,JDK Bug 4508058很早之前就提到了,可是sun却不愿意修复也不愿意提供一种新的Charset来帮助我们处理UTF-8的BOM。但是例如windows的notepad等程序在保存为UTF-8时都会带上BOM,那么用JAVA的java.io.InputStreamReader来读取就会在最前面出现一个“?”。
既然sun以兼容性的问题不愿意修复,那么只有自己来完成它们了,当然也已经有人帮我们做了这样的事情:
UnicodeInputStream.java
UnicodeReader.java

可以用来弥补,它们可以处理BOM并自动识别流,并且把讨厌的“?”去掉。

No comments: