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

 我来答
yugi111
推荐于2018-05-09 · TA获得超过8.1万个赞
知道大有可为答主
回答量:5.1万
采纳率:70%
帮助的人:1.3亿
展开全部
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格式
/**
* UTF-8编码格式判断

* @param rawtext
*            需要分析的数据
* @return 是否为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;
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式