我们知道VC++ MFC的CString类的GetLength()返回的是byte数而不是字符个数,所以我们在字符串截取的时候就会遇到一些问题。
比如说我们有一个宽度是7个byte的全半角字符混在的字符串:
"理a程序"
我们有一个需求:截取6个byte,当第6个byte和第7个byte是一个全角字符(比如汉字)的时候,把这个全角字符忽略掉。
我们可以用下面的方法实现上述功能。
CString GetBytesCut(CString strString, int nByteSize)
{
CString strCnvString = "" ;
int nCnt = (int)0 ;
CString strLEADString = "" ; // 值
CString strResultString = "" ; // 值
int nMBC_TYPE = _MBC_SINGLE ;
// 字符串长度(单位:byte)
int nStringLength = strString.GetLength();
for( int nIndex = (int)0; nIndex < nStringLength; nIndex++ )
{
// 当前byte的类型判断
nMBC_TYPE = _mbbtype( strString[ nIndex ], nMBC_TYPE );
// 多字节文字的高位字节的时候
if( _MBC_LEAD == nMBC_TYPE )
{
strLEADString = strString[ nIndex ];
++nCnt ;
continue;
}
// 多字节文字的低位字节的时候
else if( _MBC_TRAIL == nMBC_TYPE )
{
strResultString = "" ;
strResultString = strLEADString + strString[ nIndex ];
strLEADString = "" ;
++nCnt ;
}
// 多字节文字以外的时候
else
{
strResultString = strString[ nIndex ];
++nCnt ;
}
// 最后一个byte是 单字节字符 或者 多字节字符的低位字节 的时候
if( nByteSize == nCnt )
{
strCnvString = strCnvString + strResultString ;
break ;
}
// 最后一个byte是多字节字符的高位字节的时候(即,一个完整的汉字被分成两半的时候)
else if (nByteSize < nCnt)
{
break ;
}
// 不需要截取的时候
else
{
strCnvString = strCnvString + strResultString ;
}
}
return( strCnvString );
}
我们可以这样调用:
CString str = "理a程序";
GetBytesCut(str,6)
返回结果是:"理a程"