Length函数的三种实现方式
unsigned char utf8_look_for_table[] = {
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 1, 1
};
/********************************************************************
*
* SQL Length1函数实现
* @str : 字符串的首地址
* @srcLen: 字符串的长度
* 返回值:
* 表示字符串中包含多少个字符。
*
********************************************************************/
int Length1(const char *str, int srcLen) {
int len = 0;
int retLen = 0;
int utfLen = 0;
for (const char *ptr = str; len < srcLen; retLen++) {
utfLen = UTF8_CHAR_LEN((unsigned char)*ptr);
len += utfLen;
ptr += utfLen;
}
return retLen;
}
/********************************************************************
*
* SQL Length2函数实现
* @str : 字符串的首地址
* @srcLen: 字符串的长度
* 返回值:
* 表示字符串中包含多少个字符。
*
********************************************************************/
int Length2(const char *str, int srcLen) {
int len = 0;
int retLen = 0;
int utfLen = 0;
unsigned char ch;
for (const char *ptr = str; len < srcLen; retLen++) {
ch = (unsigned char)*ptr;
if (ch < 192) {
utfLen = 1;
} else if (ch >= 224 && ch < 240) {
utfLen = 3;
} else if (ch >= 192 && ch < 224) {
utfLen = 2;
} else if (ch >= 240 && ch < 248) {
utfLen = 4;
} else if (ch >= 248 && ch < 252) {
utfLen = 5;
} else if (ch >= 252 && ch < 254) {
utfLen = 6;
} else {
utfLen = 1;
}
len += utfLen;
ptr += utfLen;
}
return retLen;
}
/********************************************************************
*
* SQL Length3函数实现
* @str : 字符串的首地址
* @srcLen: 字符串的长度
* 返回值:
* 表示字符串中包含多少个字符。
*
********************************************************************/
int Length3(const char *str, int srcLen) {
int len = 0;
int retLen = 0;
int utfLen = 0;
for (const char *ptr = str; len < srcLen; retLen++) {
utfLen = UTFLEN((unsigned char)*ptr);
len += utfLen;
ptr += utfLen;
}
return retLen;
}
int main() {
//std::string str = "hello world 我们";
//std::string str = "我们";
std::string str = "a";
int size1 = Length1(str.c_str(),str.length());
std::cout << size1 << std::endl;
int size2 = Length2(str.c_str(), str.length());
std::cout << size2 << std::endl;
int size3 = Length3(str.c_str(), str.length());
std::cout << size3 << std::endl;
return 0;
}