论坛里看到的两种方法:
不知道传进来的这个参数应该怎么设置,求解呀!谢谢各位大虾!要用这个判断一个文本文件的话,应该传什么参数进来呀,谢谢了!
/*!\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));
}
}
//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