带汉字的字符串分段
在多字节环境下,假设一个长字符串(包括字母符号和汉字)需要分段,默认按每137个字节为一段分成小串,即indexFenPian=137,但不能将汉字拆分,如遇到汉字拆分的情况可以将此串分为(137上下浮动一个字节)个字节为一段,求实际中每次分片的indexFenPian值:
(利用汉字的两个字节都是高位为1来进行)
indexFenPian=137;int isHanFlag=0;for (int i=136;i>=0;i--) //从分片处向前遍历,汉字的两个字节都是高位为1{if(!(chatText[i]&0x80)) //如果遇到第一个非高位为1的,也就是非汉字的蹦出{ break;}isHanFlag++; //累计连续汉字的字节总数}if (isHanFlag%2!=0) //如果累计连续汉字的字节总数是奇数则说明有拆分汉字情况{indexFenPian=indexFenPian-1;}---------------------------------------------------
// 带汉字的字符串分段
void CQtoolsDlg::OnButton2() { UpdateData(true); CString str=m_str; CString c[3]={""}; //字符串分3段 int len = str.GetLength(); int j; CString m_slen; m_slen.Format("%d",len); for(int i = 0;i <len;i++) { if( str[i] & 0x80) //如果属于汉字的高位 位运算该处为汉字 { if (i<=29) j=0; else if(i<=58) j=1; else j=2; c[j]+=str.Mid(i,2); //mid来获取指定位置的字符,从i开始的2位 i++; } else { if (i<=29) j=0; else if(i<=58) j=1; else j=2; c[j]+=str[i]; } } MessageBox(c[0]+"\r\n"+c[1]+"\r\n"+c[2]+"\r\n", "字符个数 "+m_slen,MB_OK); }
//测试功能/
void CQtoolsDlg::OnButton3()
{ // TODO: Add your control notification handler code here CString str= "中s国qqq人民解放d军s123 "; CString c1; int len = str.GetLength(); for(int i = 0;i <len;i++) { //如果属于汉字的高位 //汉字高位为1 // 01111111 -- 11111111 // 0x 7f-- 0x ff if( str[i] & 0x80) //位运算该处为汉字 { c1+=str.Mid(i,2); //mid来获取指定位置的字符,从i开始的2位 i++; } else { c1+=str[i]; } } MessageBox(c1,MB_OK); }//测试功能/
void CQtoolsDlg::OnButton4()
{ UpdateData(true);CString str= "我";
CString changestr,changestr1; int len = str.GetLength(); /* for(int i = 1;i <len;i++) { changestr+=str[i]; } */ changestr. Format("%x",m_one[0]); //文本字符串 changestr1. Format("%x",m_one[1]); MessageBox(changestr+"\r\n"+changestr1,MB_OK); }-----------------------------------------
C++判断一个char字符串,下标为N是不是汉字.
思路: C++中的通用方法是判断这个char的最高位是不是为1,因为英文字符的值一定小于0x80,即最高们是0,而中文字符(所占的两个字符都是)的最高位是1. (但有些特殊字符也是1,比如:★(A1EF、U+2605)等等这些字符。应当注意).//代码示例: char * str[50] = “test!我们test.”;
if(str[i] & 0x80 )
// 下标为 i 是个中文字符(或半个中文字符); else // 下标为 i 是个英文字符;//下面是我常用的取字符串位置的函数
int GetCharPos(const string &str, int pos) { int i = 0; for (; i < (int)str.size() && i < pos; ++i) { if (str[i] & 0x80) ++i; } return i; }--------------------------