判断一个文件是否为utf-8格式的java代码,自己看吧

louzhu_SB 2013-04-02 07:19:06
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;


public class Utf {
static String basePath="C:\\Users\\Administrator\\Desktop\\utf\\";
public static void main(String[] args) {
try {
System.out.println(isUtf(basePath+"web.xml"));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

/**
* 用有限状态机写的
* @param filePath
* @return
* @throws IOException
*/
public static boolean isUtf(String filePath) throws IOException{
FileInputStream fis=new FileInputStream(filePath);
byte[] bbuf=new byte[1024];
int L=-1;
int status=0;//状态
int oneByteCount=0;
int twoByteCount=0;
int threeByteCount=0;
int fourByteCount=0;
int errorCount=0;
while((L=fis.read(bbuf))!=-1){
for (int i = 0; i <L; i++) {
byte b=bbuf[i];
// System.out.print(Integer.toHexString(b&0xff)+"|");
switch (status) {
case 0:
if(b>=0&&b<=(byte)0x7F)//一个字节的首字节范围
oneByteCount++;//一个字节的数量加一
else if(b>=(byte)0xC0&&b<=(byte)0xDF)//两个字节的首字节范围
status=2;//跳到状态2
else if(b>=(byte)0xE0&&b<=(byte)0XEF)//三个字节的首字节范围
status=4;//跳到状态4
else if(b>=(byte)0xF0&&b<=(byte)0xF7)//四个字节的首字节范围
status=7;//跳到状态7
else
errorCount++;

break;
case 1:
break;
case 2:
if(b>=(byte)0x80&&b<=(byte)0xBF){//两个字节的第二个字节范围
twoByteCount++;//
status=0;
}else{
errorCount+=2;
status=0;
}
break;
case 3:
break;
case 4:
if(b>=(byte)0x80&&b<=(byte)0xBF)//三个字节的第二个字节的范围
status=5;
else{
errorCount+=2;
status=0;
}
break;
case 5:
if(b>=(byte)0x80&&b<=(byte)0xBF){//三个字节的第三个字节的范围
threeByteCount++;
status=0;
}else{
errorCount+=3;
status=0;
}
break;
case 7:
if(b>=(byte)0x80&&b<=(byte)0xBF){//四个字节的第二个字节的范围
status=8;
}else{
errorCount+=2;
status=0;
}
break;
case 8:
if(b>=(byte)0x80&&b<=(byte)0xBF){//四个字节的第三个字节的范围
status=9;
}else{
errorCount+=3;
status=0;
}
break;
case 9:
if(b>=(byte)0x80&&b<=(byte)0xBF){//四个字节的第四个字节的范围
fourByteCount+=4;
status=0;
}else{
errorCount++;
status=0;
}
break;
default:
break;
}
}

}

System.out.println("一个字节的有:"+oneByteCount);
System.out.println("两个字节的有:"+twoByteCount);
System.out.println("三个字节的有:"+threeByteCount);
System.out.println("四个字节的有:"+fourByteCount);
System.out.println("错误个数:"+errorCount);
System.out.println("总共字节数有:"+(oneByteCount+twoByteCount*2+threeByteCount*3+fourByteCount*4+errorCount));

if(errorCount==0){
return true;
}
return false;
}

}
...全文
638 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
louzhu_SB 2013-04-07
  • 打赏
  • 举报
回复
引用 9 楼 bao110908 的回复:
UTF-8 编码的数据中 BOM 字符是可以省略掉的,而且大多数的应用软件都将编码格式为 UTF-8 的 BOM 省略掉了。
什么是Bom
  • 打赏
  • 举报
回复
UTF-8 编码的数据中 BOM 字符是可以省略掉的,而且大多数的应用软件都将编码格式为 UTF-8 的 BOM 省略掉了。
你好不开心 2013-04-05
  • 打赏
  • 举报
回复
我是来看楼主名字的
rumlee 2013-04-03
  • 打赏
  • 举报
回复
引用 1 楼 lyyzm4321 的回复:
顶!楼主名字好帅气
++ 楼主这个代码很好。
想喝咖啡的貓 2013-04-03
  • 打赏
  • 举报
回复
UTF-8头 不就几个字节吗? 需要读1024?
rockets311 2013-04-03
  • 打赏
  • 举报
回复
七神之光 2013-04-03
  • 打赏
  • 举报
回复
少年太天真 2013-04-03
  • 打赏
  • 举报
回复
顶!楼主名字好帅气
LCore 2013-04-03
  • 打赏
  • 举报
回复
引用 6 楼 louzhu_SB 的回复:
引用 4 楼 AFer198215 的回复:UTF-8头 不就几个字节吗? 需要读1024? 并不是所有utf-8文件 前面没加那几个字节,比如java文件,xml文件等等,你用记事本写的话可以那样判断。
++ 楼主名字好帅气!
louzhu_SB 2013-04-03
  • 打赏
  • 举报
回复
引用 4 楼 AFer198215 的回复:
UTF-8头 不就几个字节吗? 需要读1024?
并不是所有utf-8文件 前面没加那几个字节,比如java文件,xml文件等等,你用记事本写的话可以那样判断。

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧