• 11961阅读
  • 7回复

【原创】unicode utf8编码判断,欢迎大家评论,给我更好的方法,最好给我加点分:) [复制链接]

上一主题 下一主题
离线qqqmal
 
只看楼主 倒序阅读 楼主  发表于: 2005-09-19
/*!\class bool xxx::isUtf8(const char *str)
* \brief utf8编码编码判断函数
* \param 无
* \author qqqmal
* \version 无
* \exception 无
* \return 无
*/
bool xxx::isUtf8(const char *str)
{
    unsigned int len = strlen (str);
    unsigned int counter = 0;
    unsigned char head = 0x80;
    unsigned char tempStr;
    unsigned int gbNum = 0,utf8Num = 0;
    bool gb2 = FALSE;/*第二个字节是否为汉字 */
   
    for (int i=len-1; i>=0; i--) {
        tempStr = (unsigned char)str[ i];
        /*GB判断, gb范围:第一字节161~247,第二字节161~254 */
        if (!gb2 && (tempStr>161) && (tempStr<254)) {
              gb2 = TRUE;
        }
        else
        if (gb2 && (tempStr> 161) && (tempStr<247)) {
              gbNum++;
              gb2 = FALSE;        
        }
        else
        {
              gb2 = FALSE;    
        }
       
        /* utf8判断 */
        if ((tempStr&0xc0) == 0x80 ) {
              counter ++;
              head = head>>1;
              head |= 0x80;
        }
        else
        if (counter > 0) {
              if ((((head>>1)|0x80)&tempStr) == head) {
                  utf8Num++;
                  head = 0x80;
                  counter = 0;
            }
        } else {
              head = 0x80;
              counter = 0;
        }
    }

    if (gbNum*2 <= utf8Num*3) {
        return TRUE;
    } else {
        return FALSE;
    }
}

使用方法举例:
    if (isUtf8(text)) {        
        label->setText(QObject::trUtf8 (text));
    } else {
        label->setText(QObject::tr (text));
    }

    }
[p:5] 文字
[ 此贴被XChinux在2005-09-19 12:49重新编辑 ]
离线giscn
只看该作者 1楼 发表于: 2005-09-19
Re:【原创】unicode utf8编码判断,欢迎大家评论,给我更好的方法,最好给我加点
//try this one. it will yield more accurate result.

const bool BTStringMgr::isUtf8(const char *buf) {
int i, n;
register unsigned char c;
bool gotone = false;

#define F 0   /* character never appears in text */
#define T 1   /* character appears in plain ASCII text */
#define I 2   /* character appears in ISO-8859 text */
#define X 3   /* character appears in non-ISO extended ASCII (Mac, IBM PC) */

static const unsigned char text_chars[256] = {
    /*             BEL BS HT LF   FF CR   */
    F, F, F, F, F, F, F, T, T, T, T, F, T, T, F, F, /* 0x0X */
    /*                     ESC       */
    F, F, F, F, F, F, F, F, F, F, F, T, F, F, F, F, /* 0x1X */
    T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, /* 0x2X */
    T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, /* 0x3X */
    T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, /* 0x4X */
    T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, /* 0x5X */
    T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, /* 0x6X */
    T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, F, /* 0x7X */
    /*         NEL                   */
    X, X, X, X, X, T, X, X, X, X, X, X, X, X, X, X, /* 0x8X */
    X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, /* 0x9X */
    I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, /* 0xaX */
    I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, /* 0xbX */
    I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, /* 0xcX */
    I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, /* 0xdX */
    I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, /* 0xeX */
    I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I   /* 0xfX */
};

/* *ulen = 0; */
for (i = 0; (c = buf[i ]); i++) {
  if ((c & 0x80) == 0) {     /* 0xxxxxxx is plain ASCII */
    /*
    * Even if the whole file is valid UTF-8 sequences,
    * still reject it if it uses weird control characters.
    */

    if (text_chars[c] != T)
    return false;

  } else if ((c & 0x40) == 0) { /* 10xxxxxx never 1st byte */
    return false;
  } else {                   /* 11xxxxxx begins UTF-8 */
    int following;

  if ((c & 0x20) == 0) {         /* 110xxxxx */
    following = 1;
  } else if ((c & 0x10) == 0) {     /* 1110xxxx */
    following = 2;
  } else if ((c & 0x08) == 0) {     /* 11110xxx */
    following = 3;
  } else if ((c & 0x04) == 0) {     /* 111110xx */
    following = 4;
  } else if ((c & 0x02) == 0) {     /* 1111110x */
    following = 5;
  } else
    return false;

    for (n = 0; n < following; n++) {
    i++;
    if (!(c = buf[i ]))
      goto done;

    if ((c & 0x80) == 0 || (c & 0x40))
      return false;
    }
    gotone = true;
  }
}
done:
return gotone;   /* don't claim it's UTF-8 if it's all 7-bit */
}

#undef F
#undef T
#undef I
#undef X
[ 此贴被XChinux在2005-09-19 16:50重新编辑 ]
http://nzt.spaces.live.com
离线qqqmal
只看该作者 2楼 发表于: 2005-09-19
good
离线hanfeng000
只看该作者 3楼 发表于: 2010-03-17
为什么 我这不管用
android 创意 开发论坛  www.android-zh.com
离线adria

只看该作者 4楼 发表于: 2010-12-05
学习了。mark.
离线lxbin2003

只看该作者 5楼 发表于: 2010-12-06
使用iconv吧
离线voidbroken

只看该作者 6楼 发表于: 2011-03-30
直接问他,有没有编码标记
离线maidisula

只看该作者 7楼 发表于: 2012-08-09
如果utf8文件没有标示该怎样判断呢?
快速回复
限100 字节
 
上一个 下一个