在上一篇《VC++ MFC字符串截取实践心得(一)》中提到下面的需求:
比如说我们有一个宽度是7个byte的全半角字符混在的字符串:
"理a程序"
要求截取6个byte,当第6个byte和第7个byte是一个全角字符(比如汉字)的时候,把这个全角字符忽略掉。
这个在上一篇中已经实现了,有兴趣的读者可以参照上一篇。
现在我们把需求修改一下:这次不截取要求截取6个byte了,截取3个文字。
实现方法参照下面:
CString GetStringCut( CString strString, int nStringSize )
{
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 ];
// 高字节的时候跳过,文字数不计数
continue;
}
// 多字节文字的低位字节的时候
else if( _MBC_TRAIL == nMBC_TYPE )
{
strResultString = "" ;
// 高字节和低字节拼在一起组成一个全角字符
strResultString = strLEADString + strString[ nIndex ];
strLEADString = "" ;
// 高字节和低字节的组合只计一次数
++nCnt ;
}
// 多字节文字以外的时候
else
{
strResultString = strString[ nIndex ];
// 单字节字符和多字节字符一样计数
++nCnt ;
}
// 已经达到截取字数的时候
if( nStringSize == nCnt )
{
strCnvString = strCnvString + strResultString ;
break ;
}
else
{
strCnvString = strCnvString + strResultString ;
}
}
return( strCnvString );
}
调用方法:
CString str = "理a程序";
GetStringCut(str,3)
// 返回结果:"理a程"