/**
* 得到文件字符集名称
*
* @param file 文件
*
* @return {@link String}
*
* @throws Exception 异常
*/
private static String getFileCharsetName(String filePath) throws Exception {
String charset = "GBK";
byte[] first3Bytes = new byte[3];
try {
boolean checked = false;
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(filePath));
bis.mark(0);
int read = bis.read(first3Bytes, 0, 3);
if (read == - 1) {
//文件编码为 ANSI
return charset;
} else if (first3Bytes[0] == (byte) 0xFF
&& first3Bytes[1] == (byte) 0xFE) {
//文件编码为 Unicode
charset = "UTF-16LE";
checked = true;
} else if (first3Bytes[0] == (byte) 0xFE
&& first3Bytes[1] == (byte) 0xFF) {
//文件编码为 Unicode big endian
charset = "UTF-16BE";
checked = true;
} else if (first3Bytes[0] == (byte) 0xEF
&& first3Bytes[1] == (byte) 0xBB
&& first3Bytes[2] == (byte) 0xBF) {
//文件编码为 UTF-8
charset = "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;
}
自动识别txt编码读取文本,防止乱码
最新推荐文章于 2024-05-02 21:17:26 发布