获取文件编码
2015-07-30 16:32
375 查看
此文章是从我自己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;
}
还有,在这里,一定要注意,用流处理文件时,结束后一定要关闭流,不然会有问题
不管上传还是下载都会用到流来处理,但在处理过程中,多多少少会遇到乱码的问题,这里提供如何获取文件编码的方法(网上转载的,源地址忘了,这里对原作者说声不好意思,在这里记录下来,方便查阅),知道文件编码以后,对文件的处理就方便了。上代码
/**
* 获取文件编码
* @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;
}
还有,在这里,一定要注意,用流处理文件时,结束后一定要关闭流,不然会有问题
相关文章推荐
- vs2003 js文件编码问题的解决方法
- 文件编码导致jquery失效的解决方法
- 使用python的chardet库获得文件编码并修改编码
- c++读写文件流实例程序讲解
- android从资源文件中读取文件流并显示的方法
- php通过文件流方式复制文件的方法
- Shell脚本遍历目录并批量修改文件编码
- 使用iconv批量改变文件编码的shell脚本
- C#文件流进行压缩和解压缩的方法
- PowerShell Out-File指定文件编码的方法
- RTSP 协议分析
- FileStream类学习笔记
- 经典例题——计算代码行数(OC)
- 在SQL Server 2008中配置文件流(FILESTREAM)
- C#通过文件流下载文件
- 文件流的操作
- C文件流操作的fread和fseek
- UNIX环境高级编程(第5章 标准I/O库)
- 程序实践系列(十):C++流和文件流
- java文件编码转换