您的位置:首页 > 编程语言 > Java开发

Java读取Unicode文件(UTF-8等)时碰到的BOM首字符问题,及处理方法

2018-09-17 16:31 627 查看
转载:https://blog.csdn.net/clementad/article/details/47168573 2015-18-01修改:增加 apache commons io 处理方法。   在Windows下用文本编辑器创建的文本文件,如果选择以UTF-8等Unicode格式保存,会在文件头(第一个字符)加入一个BOM标识。   这个标识在Java读取文件的时候,不会被去掉,而且String.trim()也无法删除。如果用readLine()读取第一行存进String里面,这个String的length会比看到的大1,而且第一个字符就是这个BOM。   这种情况会造成一些麻烦,比如在读取ini文件的时候,如果想判断第一行是不是以“[”开头就无法正确判断。   幸好,Java在读取Unicode文件的时候,会统一把BOM变成“\uFEFF”,这样的话,就可以自己手动解决了(判断后,用substring()或replace()去除掉这个BOM):
  1.   if(line.startsWith("\uFEFF")){
  2.   //line = line.substring(1);
  3.   line = line.replace("\uFEFF", "");
  4.   }
  然而,这种方法并不是完美的,如果生成jar文件在windows下运行,还是有问题。终极的解决方法是使用apache commons io提供的BOMInputStream:
  1.   <dependency>
  2.   <groupId>commons-io</groupId>
  3.   <artifactId>commons-io</artifactId>
  4.   <version>2.4</version>
  5.   </dependency>

  1.   BufferedReader reader = null;
  2.   try {
  3.   //reader = new BufferedReader(new FileReader(file));
  4.    
  5.   //使用BOMInputStream自动去除UTF-8中的BOM!!!
  6.   reader = new BufferedReader(new InputStreamReader(new BOMInputStream(new FileInputStream(file))));
  7.    
  8.   String str = null;
  9.   //一次读入一行(非空),直到读入null为文件结束
  10.   while ((str = reader.readLine()) != null) {
  11.   }
  什么是BOM? BOM = Byte Order Mark BOM是Unicode规范中推荐的标记字节顺序的方法。比如说对于UTF-16,如果接收者收到的BOM是FEFF,表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。 UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明“我是UTF-8编码”。BOM的UTF-8编码是EF BB BF(用UltraEdit打开文本、切换到16进制可以看到)。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。   所有的BOM在C/C++/Java中都被处理为"\uFEFF"(???貌似不一定。。。),参考:http://www.fileformat.info/info/unicode/char/feff/index.htm   Wikipedia关于POM的说明介绍: https://en.wikipedia.org/wiki/Byte_order_mark   (原创文章,转载请注明转自Clement-Xu的博客:https://www.geek-share.com/detail/2649319041.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐