截取utf8字符串
2015-10-18 19:07
330 查看
string convertString(string str ,int length)
{
vector<std::string > subStrs;
int index=0;
int str_size=str.size();
int bytes=0;
while(index<str_size)
{
bytes=sub_utf_str(str,index,length);
if(bytes==-1)
{
return "wrong";
}
string substr=str.substr(index,bytes);
subStrs.push_back(substr);
index+=bytes;
}
std::string resultStr;
for (unsigned int i = 0;i<subStrs.size();++i)
{
resultStr.append(subStrs[i]).append("\n");
}
return resultStr;
}
//从字符串str的index开始截取length个utf8字符,返回char的个数
int sub_utf_str(string str,int index,int length)
{
int i=0;
int count=0;
int str_size=str.size();
if(index>=str_size)
{
return -1;
}
for(i=0;i<length;i++)
{
char ch=str.at(index);
int bytes=utf8_check_first(ch);
if(bytes==0)
{
return -1;
}
index+=bytes;
count+=bytes;
if(index==str_size)
{
break;
}
if(index>str_size)
{
return -1;
}
}
return count;
}
int utf8_check_first(char byte)
{
unsigned char u = (unsigned char)byte;
if(u&0x80==0)
{
return 1;
}
if(u&0x40==0)
{
return 0;
}
if(u&0x20==0)
{
return 2;
}
if(u&0x10==0)
{
return 3;
}
if(u&0x08==0)
{
return 4;
}
if(u&0x40==0)
{
return 5;
}
if(u&0x20==0)
{
return 6;
}
return 0;
}
{
vector<std::string > subStrs;
int index=0;
int str_size=str.size();
int bytes=0;
while(index<str_size)
{
bytes=sub_utf_str(str,index,length);
if(bytes==-1)
{
return "wrong";
}
string substr=str.substr(index,bytes);
subStrs.push_back(substr);
index+=bytes;
}
std::string resultStr;
for (unsigned int i = 0;i<subStrs.size();++i)
{
resultStr.append(subStrs[i]).append("\n");
}
return resultStr;
}
//从字符串str的index开始截取length个utf8字符,返回char的个数
int sub_utf_str(string str,int index,int length)
{
int i=0;
int count=0;
int str_size=str.size();
if(index>=str_size)
{
return -1;
}
for(i=0;i<length;i++)
{
char ch=str.at(index);
int bytes=utf8_check_first(ch);
if(bytes==0)
{
return -1;
}
index+=bytes;
count+=bytes;
if(index==str_size)
{
break;
}
if(index>str_size)
{
return -1;
}
}
return count;
}
int utf8_check_first(char byte)
{
unsigned char u = (unsigned char)byte;
if(u&0x80==0)
{
return 1;
}
if(u&0x40==0)
{
return 0;
}
if(u&0x20==0)
{
return 2;
}
if(u&0x10==0)
{
return 3;
}
if(u&0x08==0)
{
return 4;
}
if(u&0x40==0)
{
return 5;
}
if(u&0x20==0)
{
return 6;
}
return 0;
}
相关文章推荐
- node+mongodb+WP构建的移动社交应用源码 分享
- 测试数据库sql声明效率
- STL中 map 和 multimap
- Fragment之间的通信交互问题
- hdu5504 GT and sequence
- 黑马程序员——集合之Set和Map
- 提防包装类型的null值
- 常见字符串操作函数
- 对恢复任务函数OSTaskResume()的理解
- 在ubuntu系统中使用dpkg命令安装后缀名为deb的软件包
- java基础问题--JAVA的传值方式(一)
- 人脸数据库
- 使用CocoaPods被卡住:Updating local specs repositories
- Oracle逻辑备份与恢复
- 信息安全系统设计基础第六周学习总结
- LVS Nginx HAProxy 优缺点
- Linux集群部署系列(六):Hadoop 在window系统下安装方法
- 判断101-200之间有多少个素数,并输出所有素数
- 【译】快速高效学习Java编程在线资源Top 20
- zend framework virtualhost设置方法