在utf-8编码的前提下,一个字符可能占用的空间为1~4个char,由于这种不确定的字符长度导致在utf-8编码的string中,无法直接使用substr进行字符串分割。
解决的方案的关键在于利用utf-8编码的特点,utf-8的第一个字符的前缀连续为1的个数代表这个”字“占用的字符数量,当只有一个字符时,第一个字符的第一位为0。具体的说明可以参考这篇文章。http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html
这里主要说明怎么利用代码解决这个问题
int getUtf8CharLength(char c){
int len = 0;
if(c > 0){ //利用计算机中数字的存储特点,第一位为1为负,第一位为0为正,很容易判断
return len + 1; //第一位为0时为特殊情况,需要加1
}
while(c < 0){
len++;
c = c << 1;
}
return len;
}
std::string substrWithChinese(std::string str,unsigned int start,unsigned int length){
unsigned int i = 0; //标识前进的几个“字符”
unsigned int cursor = 0; //标识前进了几个“字”
unsigned int save = 0; //保存的字符标识
unsigned int len = str.length();
char* c = new char[len + 1];
while(str[i] != '\0'&&length > 0){
unsigned int l = getUtf8CharLength(str[i]); //获取字符长度
if(cursor >= start){
unsigned int m = l;
while(m--){
c[save++] = str[i++];
}
length--;
}else{
i+=l;
}
cursor++;
}
c[i] = '\0';
return std::string(c);
}