转载http://blog.sina.com.cn/s/blog_62b2318d0101d7kb.html
C或C++语言处理宽字节字符串上是个弱项,虽然stl定义了wstring等类型,但是实际应用中还是存在一些问题,而C语言的支持就更少了,如果想跨平台,问题就会更多。
#include
#include
#include
//utf8字符长度1-6,可以根据每个字符第一个字节判断整个字符长度
//0xxxxxxx
//110xxxxx 10xxxxxx
//1110xxxx 10xxxxxx 10xxxxxx
//11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
//111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
//1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
//
//定义查找表,长度256,表中的数值表示以此为起始字节的utf8字符长度
unsigned
{
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
2,
2,
3,
4,
};
#define UTFLEN(x)
//计算str字符数目
int
{
int
int
for(char
*ptr!=0&&len<clen;
len++, ptr+=UTFLEN((unsigned
return
}
//get子串
char* subUtfString(char
{
int
if(start >= len)
if(end > len) end = len;
char
for(int
char
for(int
int
char
memcpy(retStr, sptr, retLen);
retStr[retLen] =
return
}
int
{
char
printf("%s\n", str);
for(char
unsigned
printf("str[%d] is a word character with %d bytes\n", c,
ptr +=
}
printf("%d\n",
char
if(sub) {
printf("%s\n", sub);
free(sub);
sub =
}
return
}
程序在osx下调试通过。
在vs2005下,默认的文件编码格式是gb2312,需要将文件保存成utf8格式。