写了两个函数 utf8_strlen 和 utf8_getchar

没有找到现成的,自己写了个,实现的很差,高手多多指教。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
unsigned int utf8_strlen(const char * str, unsigned int len)
{
	/* 参数检查 */
	if(!str) return -1;
	if(len <= 0) return -1;
 
	unsigned int i, c;
	for(c=0, i=0; i<len; i++)	/* 循环统计 */
	{
		if((str[i] & 0x80) == 0x0)	/* 0b0xxxxxxx */
		  c++;
		else if((str[i] & 0xc0) == 0xc0)	/* 0b11xxxxxx */
		  c++;
	}
 
	return c;
	return -1;
}
 
char * utf8_getchar(const char * str, unsigned int len, unsigned int p)
{
	/* 参数检查 */
	if(!str) return NULL;
	if(len <= 0) return NULL;
	if((p<0) || (p >= utf8_strlen(str, len))) return NULL;
 
	unsigned int i, c, s=0, l=0, b=0;
	for(c=0, i=0; i<len; i++)
	{
		if((str[i] & 0x80) == 0x0)
		{
			c++;
			if(b == 1)		/* 长度计算 */
			{
				l = i - s;
				break;
			}
		}
		else if((str[i] & 0xc0) == 0xc0)
		{
			c++;
			if(b == 1)		/* 长度计算 */
			{
				l = i - s;
				break;
			}
		}
		if(((c - 1) == p) && (b == 0))	/* 记录起始位置 */
		{
			s = i;
			b = 1;
		}
	}
	if(l == 0)		/* 长度计算 */
	  l = len - s;
 
	char * ret = malloc(l);	/* 分配内存,需要 free() */
	memmove(ret, str+s, l);
	ret[l] = 0;
	return ret;
	return NULL;
}
 
/* 例子 */
int main(int argc, char * argv[])
{
	char * str = "Hello 您好 123456 !@#$%";
 
	printf("len = %d\n", utf8_strlen(str, strlen(str)));
 
	int i;
	for(i=0; i<utf8_strlen(str, strlen(str)); i++)
	{
		char * s = utf8_getchar(str, strlen(str), i);
		printf("%d: %s\tlen=%d\n", i, s, strlen(s));
		free(s);
	}
 
	return 0;
}

Leave a Reply

Your email address will not be published. Required fields are marked *