复制代码代码如下:
public static string getcharset (arquivo de arquivo) {
String charset = "gbk";
byte [] First3Bytes = novo byte [3];
tentar {
booleano verificado = false;
BufferInputStream bis = new bufferInputStream (
new FileInputStream (File));
bis.mark (0);
int read = bis.read (First3bytes, 0, 3);
if (leia == -1)
retorno charset;
if (First3Bytes [0] == (byte) 0xff && primeiro3bytes [1] == (byte) 0xfe) {
charset = "utf-16le";
verificado = true;
} else if (First3Bytes [0] == (byte) 0xfe && First3Bytes [1]
== (byte) 0xff) {
charset = "utf-16be";
verificado = true;
} else if (First3Bytes [0] == (byte) 0xef && First3bytes [1]
== (byte) 0xbb
&& primeiro3bytes [2] == (byte) 0xbf) {
charset = "utf-8";
verificado = true;
}
bis.reset ();
if (! verificado) {
int loc = 0;
while ((read = bis.read ())! = -1) {
loc ++;
if (leia> = 0xf0)
quebrar;
// 单独出现 Bf 以下的 , 也算是 GBK
if (0x80 <= leia && leia <= 0xbf)
quebrar;
if (0xc0 <= leia && leia <= 0xdf) {
leitura = bis.read ();
if (0x80 <= leia && leia <= 0xbf) // 双字节 (0xc0 - 0xdf)
// (0x80 -
// 0xbf), 也可能在 GB 编码内
continuar;
outro
quebrar;
// 也有可能出错 , 但是几率较小
} else if (0xe0 <= leia && leia <= 0xef) {
leitura = bis.read ();
if (0x80 <= leia && leia <= 0xbf) {
leitura = bis.read ();
if (0x80 <= leia && leia <= 0xbf) {
charset = "utf-8";
quebrar;
} outro
quebrar;
} outro
quebrar;
}
}
System.out.println (loc + "" + integer.tohexstring (read));
}
bis.close ();
} catch (Exceção e) {
E.PrintStackTrace ();
}
retorno charset;
}