关于截取带有中文字符字符串问题
最近在做东西时候碰到了一个问题,当字符串中有中文,要截取固定长度的字符串,不能截取半截的字符串,在百度上也看了看,没有用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 += 2为CharCount += 3,并且多加一行Intercept += str[++i],如下:
Intercept += str[i];
Intercept += str[++i];
Intercept += str[++i];