中易网

java如何判断编码是否是utf8编码

答案:1  悬赏:10  
解决时间 2021-01-06 00:04
java如何判断编码是否是utf8编码
最佳答案
UTF-8编码规范 及如何判断文本是UTF-8编码的
UTF-8的编码规则很简单,只有二条:
1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。
根据以上说明 下面给出一段java代码判断UTF-8格式

public static boolean isUTF8(byte[] rawtext) {
   int score = 0;
   int i, rawtextlen = 0;
   int goodbytes = 0, asciibytes = 0;
   // Maybe also use UTF8 Byte Order Mark: EF BB BF
   // Check to see if characters fit into acceptable ranges
   rawtextlen = rawtext.length;
   for (i = 0; i < rawtextlen; i++) {
    if ((rawtext[i] & (byte) 0x7F) == rawtext[i]) { 
     // 最高位是0的ASCII字符
     asciibytes++;
     // Ignore ASCII, can throw off count
    } else if (-64 <= rawtext[i] && rawtext[i] <= -33
      //-0x40~-0x21
      && // Two bytes
      i + 1 < rawtextlen && -128 <= rawtext[i + 1]
      && rawtext[i + 1] <= -65) {
     goodbytes += 2;
     i++;
    } else if (-32 <= rawtext[i]
      && rawtext[i] <= -17
      && // Three bytes
      i + 2 < rawtextlen && -128 <= rawtext[i + 1]
      && rawtext[i + 1] <= -65 && -128 <= rawtext[i + 2]
      && rawtext[i + 2] <= -65) {
     goodbytes += 3;
     i += 2;
    }
   }
   if (asciibytes == rawtextlen) {
    return false;
   }
   score = 100 * goodbytes / (rawtextlen - asciibytes);
   // If not above 98, reduce to zero to prevent coincidental matches
   // Allows for some (few) bad formed sequences
   if (score > 98) {
    return true;
   } else if (score > 95 && goodbytes > 30) {
    return true;
   } else {
    return false;
   }

另外对于正规的文本文件来说UTF-8的文件开头有3个字节来标识该文本是UTF-8编码
EF, BB, BF三个字节
但通常不采用以下这种方案 因为许多文件不标准
public static boolean getByteEncode(byte[] b)
{
   if(b != null && b.length>3)
   {
    byte utf8[] = {(byte) 0xEF, (byte) 0xBB, (byte) 0xBF};
    if((b[0] == utf8[0])&&(b[1]==utf8[1])&&(b[2]==utf8[2]))
     return true;
   }
   return false;
}
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
离心泵的操作,为什么要先充液,再封闭启动,最
朋友梦见我被别人打是怎么回事?
这个是别克什么车型,多少钱
把人造成重度颅脑损伤死亡应该判多少年
在线等!!急!!!我国“南稻北粟”格局形成
朱元璋把叫他外号发小给杀了 哪个发小叫什么
长兴隆宾馆地址在哪,我要去那里办事
如何卸载现有的SQL Server实例
jquery怎么实现点击video播放,或暂停? 页面
oppor11红色多少钱现在
去贵州贵阳从哪里上车
在小数2.4343
大学交了学费不想读了 能退出来吗
我的世界手机版怎样做以沙子为钥匙的机关门?
类似君埋泉下泥销骨的诗句
推荐资讯
凯诺台球休闲会所怎么去啊,我要去那办事
吧友们WP8系统有没有强制重启的方法
南平到新村服务区到三明沙县服务区高速里程数
金融从事的岗位有哪些
bazaaa美容地址在哪,我要去那里办事
魂之猎手的职业介绍
古代历史上朝鲜第一个朝代喝第一位皇帝是谁
(1-85%)除以x等于14解方程怎么算
photoshop cs2是什么意思啊!
法硕(非法学)大家说的刑法分则指什么?
欣字含义详解,欣字五行属什么
网页顽固广告去不掉,请老师帮忙!
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?