获取文件编码

来源:互联网 发布:2016年天猫双十一数据 编辑:程序博客网 时间:2024/06/02 04:41

此文章是从我自己iteye博客弄过来的

不管上传还是下载都会用到流来处理,但在处理过程中,多多少少会遇到乱码的问题,这里提供如何获取文件编码的方法(网上转载的,源地址忘了,这里对原作者说声不好意思,在这里记录下来,方便查阅),知道文件编码以后,对文件的处理就方便了。上代码

/**      * 获取文件编码      * @param sourceFile      * @return      */      @SuppressWarnings({ "resource", "unused" })      private static String getFilecharset(File sourceFile) {          String charset = "GBK";          byte[] first3Bytes = new byte[3];          try {              boolean checked = false;              BufferedInputStream bis = new BufferedInputStream(                      new FileInputStream(sourceFile));              bis.mark(0);              int read = bis.read(first3Bytes, 0, 3);              if (read == -1) {                  return charset; // 文件编码为 ANSI              } else if (first3Bytes[0] == (byte) 0xFF                      && first3Bytes[1] == (byte) 0xFE) {                  charset = "UTF-16LE"; // 文件编码为 Unicode                  checked = true;              } else if (first3Bytes[0] == (byte) 0xFE                      && first3Bytes[1] == (byte) 0xFF) {                  charset = "UTF-16BE"; // 文件编码为 Unicode big endian                  checked = true;              } else if (first3Bytes[0] == (byte) 0xEF                      && first3Bytes[1] == (byte) 0xBB                      && first3Bytes[2] == (byte) 0xBF) {                  charset = "UTF-8"; // 文件编码为 UTF-8                  checked = true;              }              bis.reset();              if (!checked) {                  int loc = 0;                  while ((read = bis.read()) != -1) {                      loc++;                      if (read >= 0xF0)                          break;                      if (0x80 <= read && read <= 0xBF) // 单独出现BF以下的,也算是GBK                          break;                      if (0xC0 <= read && read <= 0xDF) {                          read = bis.read();                          if (0x80 <= read && read <= 0xBF) // 双字节 (0xC0 - 0xDF)                              // (0x80                              // - 0xBF),也可能在GB编码内                              continue;                          else                              break;                      } else if (0xE0 <= read && read <= 0xEF) {// 也有可能出错,但是几率较小                          read = bis.read();                          if (0x80 <= read && read <= 0xBF) {                              read = bis.read();                              if (0x80 <= read && read <= 0xBF) {                                  charset = "UTF-8";                                  break;                              } else                                  break;                          } else                              break;                      }                  }              }              bis.close();          } catch (Exception e) {              e.printStackTrace();          }          return charset;      } 

还有,在这里,一定要注意,用流处理文件时,结束后一定要关闭流,不然会有问题

0 0
原创粉丝点击