c++中string截取带有中文字符串的解决方案

关于截取带有中文字符字符串问题

 最近在做东西时候碰到了一个问题,当字符串中有中文,要截取固定长度的字符串,不能截取半截的字符串,在百度上也看了看,没有用c和c++实现的,几乎都是java,直接转一下类型就行了,但是这不是我想要的,我想要自己实现。
 前提:带有中文和英文的一个字符串,截取10个汉字字符长度的字符串;
 先分析一下,中文字符和英文字符站的位数不一样,(Unicode编码字符集是中文占2位,而UTF-8占3个字节,这里使用Unicode占2个字节做示范)中文是占2字节,英文占1字节,截取10个汉字就是截取20个字符的一个string,这里要考虑的就是最后一个汉字,如果最后一个汉字占string[19],string[20]的位置,超出的截取范围,就舍掉最后一个汉字,如果汉字是在string[18],string[19]的位置上,那么正好是一个完整的汉字,那么怎么判断最后一个汉字完不完整是一个主要的问题,下面是我的解决方案,可以提供参考:

#include<iostream>
#include<string>
using namespace std;
#define MAX_CHAR_LENGH (20)
int main()
{	
	string	str="123451234512345一二三";
	string Intercept;
	int CharCount = 0;
	for (int i = 0; i < str.size(); i++) {
 		if (CharCount <= MAX_CHAR_LENGH) {
    			if (str[i] & 0x80) {
    	 			CharCount += 2;			
     				if (CharCount > MAX_CHAR_LENGH ) {//对下一个中文是否超出截取范围做判断,超出即不能继续拼接字符串
      					break;
     				}
     			Intercept += str[i];
     			Intercept += str[++i];
    		} else {
     			CharCount += 1;
     			Intercept += str[i];
    		}
   	}
}

 在判断是不是中文的时候可以通过string[i]&0x80来作判断如果为真,就证明是中文字符,如果为假证明是非中文只占一个字节。
 想测试我的程序,需要注意编码集,不能是UTF-8,如果是UTF-8,需要改动CharCount += 2CharCount += 3,并且多加一行Intercept += str[++i],如下:

        Intercept += str[i];
        Intercept += str[++i];
	Intercept += str[++i];
	
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值