zoukankan      html  css  js  c++  java
  • Java读取Unicode文件(UTF-8等)时碰到的BOM首字符问题

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

    [java] view plain copy
     
    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的说明介绍:
     
    转载自Clement-Xu的csdn博客。 https://blog.csdn.net/ClementAD/article/details/47168573
  • 相关阅读:
    github国内加速
    js 关闭MediaDevices.getUserMedia()
    windows server 安装 mysql + nondejs连接mysql
    sql常用语法大全
    当小程序的flex布局遇到button时,justify-content不起作用的原因及解决方案
    c# 使用Sharp7对PLC读写操作
    c#中引用c++动态库
    Python+Django
    python+pycharm+Django报错
    Dapper支持各类数据库(mysql,mssql,FireBird,Oracle)
  • 原文地址:https://www.cnblogs.com/anye-15068156823/p/8709229.html
Copyright © 2011-2022 走看看