c utf 8文字列の長さを計算し、中国語で1文字を計算する

8974 ワード

#include 
using namespace std;
int getStrLenUtf8(const char* str)
{
	if (!str) return 0;

	int len = (int)strlen(str);

	int ret = 0;

	for (const char* sptr = str; (sptr - str) < len && *sptr;)
	{
		unsigned char ch = (unsigned char)(*sptr);

		if (ch < 0x80)
		{
			sptr++;	// ascii
			ret++;
		}
		else if (ch < 0xc0)
		{
			sptr++;	// invalid char
		}
		else if (ch < 0xe0)
		{
			sptr += 2;
			ret++;
		}
		else if (ch < 0xf0)
		{
			sptr += 3;
			ret++;
		}
		else
		{
			//   4   
			sptr += 4;
			ret++;
		}
	}

	return ret;
}

//             ,          ,  :        ,     <0,    0-63  。
int gbkStrlen(const char* str)
{
	const char* p = str;

	while (*p)
	{
		if (*p < 0 && (*(p + 1) < 0 || *(p + 1) > 63))
		{
			str++; //str     ,p    ,     1
			p += 2;
		}
		else
		{
			p++; //str   ,p        1
		}
	}
	return p - str;
}

int main()
{    
	char* str = "  12sdfsd";
	cout << getStrLenUtf8(str) << endl;
	system("pause");
	return 0;
}