判断文本文件使用的字符集

最近一段时间作东西,总是因为要处理可能不通字符集的文件而烦心,虽然遭到一个程序库,好象是模仿Mozilla的一个C库使用java实现的,但是普通的情况下使用这个库是不是太大了点.于是将GBK作为默认编码,主要判断utf-8,我实现了一个程序,在Windows下边如果使用记事本保存的TXT文件带有BOM当然很方便,但是如果没有BOM的话,就只有通过文件中的字符的编码来判断了,经过几次简单的实验,发现尚且可用。JAVA源码如下,恳请指正:
  1. static String get_charset(File file) {
  2.         String charset = "GBK";
  3.         byte [] first3Bytes = new byte[3];
  4.         try {
  5.             boolean checked = false;
  6.             BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
  7.             bis.mark(0);
  8.             int read = bis.read(first3Bytes, 03);
  9.             if (read == -1return charset;
  10.             if (first3Bytes[0] == (byte)0xFF && first3Bytes[1] == (byte)0xFE) {
  11.                 charset = "UTF-16LE";
  12.                 checked = true;
  13.             }
  14.             else if(first3Bytes[0] == (byte)0xFE && first3Bytes[1] == (byte)0xFF) {
  15.                 charset = "UTF-16BE";
  16.                 checked = true;
  17.             }
  18.             else if(first3Bytes[0] == (byte)0xEF && first3Bytes[1] == (byte)0xBB && first3Bytes[2] == (byte)0xBF) {
  19.                 charset = "UTF-8";
  20.                 checked = true;
  21.             }
  22.             bis.reset();
  23.             if (!checked) {
  24.                 int len = 0;
  25.                 int loc = 0;
  26.                 
  27.                 while ((read = bis.read()) != -1) {
  28.                     loc ++;
  29.                     if (read >= 0xF0
  30.                         break;
  31.                     if (0x80<=read && read <= 0xBF//单独出现BF以下的,也算是GBK
  32.                         break;
  33.                     if (0xC0<=read && read <= 0xDF) {
  34.                         read = bis.read();
  35.                         if (0x80<= read && read <= 0xBF)//双字节 (0xC0 - 0xDF) (0x80 - 0xBF),也可能在GB编码内
  36.                             continue;
  37.                         else 
  38.                             break;
  39.                     } else if (0xE0 <= read && read <= 0xEF) {//也有可能出错,但是几率较小
  40.                         read = bis.read();
  41.                         if (0x80<= read && read <= 0xBF) {
  42.                             read = bis.read();
  43.                             if (0x80<= read && read <= 0xBF) {
  44.                                 charset = "UTF-8";
  45.                                 break;
  46.                             } else 
  47.                                 break;
  48.                         } else
  49.                             break;
  50.                     }
  51.                 }
  52.                 System.out.println(loc + "  " + Integer.toHexString(read));
  53.             }
  54.             
  55.             bis.close();
  56.         } catch (Exception e) {
  57.             e.printStackTrace();    
  58.         }
  59.         
  60.         return charset;
  61.     }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值