Length函数的三种实现方式
#include "iostream" 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
};
#define UTFLEN(first_byte)utf8_look_for_table[(first_byte)]#define UTF8_CHAR_LEN( first_byte ) ((( 0xE5000000 >> (( first_byte >> 3 ) & 0x1e )) & 3 ) + 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;
}
推荐阅读
- 数据库|SQL行转列方式优化查询性能实践
- mysql|一文深入理解mysql
- 达梦数据库|DM8表空间备份恢复
- 数据技术|一文了解Gauss数据库(开发历程、OLTP&OLAP特点、行式&列式存储,及与Oracle和AWS对比)
- SqlServer|sql server的UPDLOCK、HOLDLOCK试验
- 谈灾难恢复指标(RTO与RPO是什么鬼())
- RPO与RTO
- 数据库|效率最高的Excel数据导入---(c#调用SSIS Package将数据库数据导入到Excel文件中【附源代码下载】)...