没有找到现成的,自己写了个,实现的很差,高手多多指教。
#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; } |