注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

眼睛想旅行

技术就是我的生命与信仰!

 
 
 

日志

 
 
关于我

精通C,C++,python,Erlang。并熟悉各种其他编程语言,用cocos2dx游戏引擎作过几个项目。会MySQL增删改查,了解OpenGL渲染原理。懂单片机,能设计数字电路系统,会画电路图和设计电路板。喜欢了解最新前沿技术,并持续关注和学习新技术。

网易考拉推荐

UTF-8字符串分段选取(转)  

2013-10-16 17:29:40|  分类: C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
C或C++语言处理宽字节字符串上是个弱项,虽然stl定义了wstring等类型,但是实际应用中还是存在一些问题,而C语言的支持就更少了,如果想跨平台,问题就会更多。
最近项目中要处理utf-8字符串,需要计算字符串长度以及对其裁剪,例子代码如下:

#include <stdio.h>

#include <string.h>

#include <stdlib.h>


 

//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 char utf8_look_for_table[] = 

{

1111111111111111,

1111111111111111,

1111111111111111,

1111111111111111,

1111111111111111,

1111111111111111,

1111111111111111,

1111111111111111,

1111111111111111,

1111111111111111,

1111111111111111,

1111111111111111,

2222222222222222,

2222222222222222,

3333333333333333,

4444444455556611

};


#define UTFLEN(x)  utf8_look_for_table[(x)]


//计算str字符数目

int getUtf8Length(char *str)

{

int clen = strlen(str);

int len = 0;

 

for(char *ptr = str; 

*ptr!=0&&len<clen; 

len++, ptr+=UTFLEN((unsigned char)*ptr));

 

return len;

}


//get子串

char* subUtfString(char *str, unsigned int start, unsigned int end)

{

int len = getUtf8Length(str);

 

if(start >= len) return NULL;

if(end > len) end = len;

 

char *sptr = str;

for(int i = 0; i < start; ++i,sptr+=UTFLEN((unsigned char)*sptr));

 

char *eptr = sptr;

for(int i = start; i < end; ++i,eptr += UTFLEN((unsigned char)*eptr));

 

int retLen = eptr - sptr;

char *retStr = (char*)malloc(retLen+1);

memcpy(retStr, sptr, retLen);

retStr[retLen] = 0;

 

return retStr;

}


int main()

{

char *str = "我的a测试工具阿斯顿aaab123阿斯顿个流氓了卡斯!";

 

printf("%s\n", str);

 

for(char *ptr=str; *ptr!=0;) {

unsigned char c = (unsigned char)*ptr;

printf("str[%d] is a word character with %d bytes\n", c, UTFLEN(c));

ptr += UTFLEN(c);

}

 

printf("%d\n"getUtf8Length(str));

 

char *sub = subUtfString(str, 2100);

if(sub) {

printf("%s\n", sub);

free(sub);

sub = NULL;

}

 

return 0;

}


程序在osx下调试通过。

在vs2005下,默认的文件编码格式是gb2312,需要将文件保存成utf8格式。

经过我的测试,可以正常使用。我是在VS2010中使用的,不过UTF-8的字符串我是从外部读进来的。

用到了一个std::string 中的const char*字符串强转为char*字符串的方法:

char* p =const_cast<char*>(loadString.c_str());

转自:http://blog.sina.com.cn/s/blog_62b2318d0101d7kb.html

  评论这张
 
阅读(370)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017