根据字节值判断文件的编码方式

14 篇文章 0 订阅
普通文件,开始就是文件内容,有编码的,开头显示编码的定义。


对于UTF-8编码格式的文本文件,其前3个字节的值就是-17、-69、-65。

可以据此判断是否是UTF-8编码格式:


File file = new File(path);
InputStream ios = new java.io.FileInputStream(file);
byte[] b = new byte[3];
ios.read(b);
ios.close();
if (b[0] == -17 && b[1] == -69 && b[2] == -65)
  System.out.println(file.getName() + “:编码为UTF-8〃);
else
  System.out.println(file.getName() + “:可能是GBK,也可能是其他编码。”);


如果项目对要判定的文本文件编码不可控(比如用户上传的一些HTML、XML等文本),可以采用一个现成的开源项目:cpdetector 。


最标准的途径是检测文本最开头的几个字节,开头字节 Charset/encoding,如下表: (此段程序尚未经过亲自验证)

EF BB BF  UTF-8
FE FF    UTF-16/UCS-2, little endian
FF FE    UTF-16/UCS-2, big endian
FF FE 00 00 UTF-32/UCS-4, little endian.
00 00 FE FF UTF-32/UCS-4, big-endian.

int[] head = new int[4];
        InputStream inputStream = new FileInputStream(path);
        for(int i=0; i<4; i++){

                head[0]=inputStream.read();
        }
        inputStream.close();

String code = "ANSI";
        if (head[0]==0xef && head[1]==0xbb && head[2]==0xbf) {
            code = "UTF-8";
            
        } else if(head[0]==0xfe && head[1]==0xff) {
            code = "utf-16/ucs2, little endian";
            
        } else if(head[0]==0xff && head[1]==0xfe) {
            code = "utf-16/ucs2, big endian";
            
        } else if(head[0]==0xff && head[1]==0xfe && head[2]==0x0 && head[3]==0x0) {
            code = "UTF-32/ucs4, little endian";
            
        } else if (head[0]==0x0 && head[1]==0x0 && head[2]==0xfe && head[3]==0xff) {
            code = "UTF-32/ucs4, big endian";
        }



  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值