【原创】C#.Net中对中英文混排的字符串按照指定宽度截取排版
摘要:在C#.Net 这样的支持Unicode字符集的环境下,字符串处理时,英文、数字、汉字以及标点符号都是当着一个字符来看待的,但是英文、中文显示时所占宽度不一致,这样在需要按照指定宽度输出时就会遇到截取到的字符串显示出来长短参差不齐的。在网上看了些别人写的一些文章,没有找到自己想要的方式。下面我就给出C#.Net中中英文混排的字符串,如何来进行按照指定宽度来截取。
今天有个程序需要在一个固定表格中输出一些文字数据,由于表格的单元格是固定的,因此用户希望能够在单元个中按照指定的宽度输出数据,超过的字符在下一行紧接着输出。我想这个在其他好多地方都会有应用的场景的。
由于C#.Net中String.Length获得的是字符数,SubString方法指定截取的起始位置也是指的Unicode字符数,但是我们这里需要输出的宽度用英文字符个数来指定,也就是说如果是英文那么就单元格中应该有10字符,如果是中文则应该有5个汉字。考虑到中文是不能将两个字符截断,如果前面有9个英文字符,后面紧接着是个中文的话,我们就只能将中文放在下一个子串中。
一、通常使用的字符串截取方法
常用的直接用SubString取子串方法得到的效果。
二、我的字符串截取方法
今天有个程序需要在一个固定表格中输出一些文字数据,由于表格的单元格是固定的,因此用户希望能够在单元个中按照指定的宽度输出数据,超过的字符在下一行紧接着输出。我想这个在其他好多地方都会有应用的场景的。
由于C#.Net中String.Length获得的是字符数,SubString方法指定截取的起始位置也是指的Unicode字符数,但是我们这里需要输出的宽度用英文字符个数来指定,也就是说如果是英文那么就单元格中应该有10字符,如果是中文则应该有5个汉字。考虑到中文是不能将两个字符截断,如果前面有9个英文字符,后面紧接着是个中文的话,我们就只能将中文放在下一个子串中。
一、通常使用的字符串截取方法
常用的直接用SubString取子串方法得到的效果。
二、我的字符串截取方法
/// <summary>
/// 获取拆分后的字符串列表。
/// </summary>
/// <param name="mOrigianlString"></param>
/// <param name="subStringCharNumber"></param>
/// <returns></returns>
private ArrayList GetSeparateSubString(string mOrigianlString, int subStringCharNumber)
{
ArrayList resultList = new ArrayList();
string tempStr = mOrigianlString;
int charNumber = subStringCharNumber;
int totalCount = 0;
string mSubStr = "";
for (int i = 0; i < tempStr.Length; i++)
{
string mChar = tempStr.Substring(i, 1);
int byteCount = Encoding.Default.GetByteCount(mChar);//关键点判断字符所占的字节数
if (byteCount == 1)
{
totalCount++;
mSubStr += mChar;
if (totalCount == charNumber || i == tempStr.Length - 1)
{
resultList.Add(mSubStr);
totalCount = 0;
mSubStr = "";
}
}
else if (byteCount > 1)
{
totalCount += 2;
if (totalCount > charNumber )
{
resultList.Add(mSubStr);
if (i == tempStr.Length - 1)
{
mSubStr = mChar;
resultList.Add(mSubStr);
}
else
{
totalCount = 2;
mSubStr = mChar;
}
}
else if (totalCount == charNumber)
{
mSubStr += mChar;
resultList.Add(mSubStr);
totalCount = 0;
mSubStr = "";
}
else if (i == tempStr.Length - 1)
{
mSubStr += mChar;
resultList.Add(mSubStr);
}
else
{
mSubStr += mChar;
}
}
}
return resultList;
}
下图为新方法处理的结果:/// 获取拆分后的字符串列表。
/// </summary>
/// <param name="mOrigianlString"></param>
/// <param name="subStringCharNumber"></param>
/// <returns></returns>
private ArrayList GetSeparateSubString(string mOrigianlString, int subStringCharNumber)
{
ArrayList resultList = new ArrayList();
string tempStr = mOrigianlString;
int charNumber = subStringCharNumber;
int totalCount = 0;
string mSubStr = "";
for (int i = 0; i < tempStr.Length; i++)
{
string mChar = tempStr.Substring(i, 1);
int byteCount = Encoding.Default.GetByteCount(mChar);//关键点判断字符所占的字节数
if (byteCount == 1)
{
totalCount++;
mSubStr += mChar;
if (totalCount == charNumber || i == tempStr.Length - 1)
{
resultList.Add(mSubStr);
totalCount = 0;
mSubStr = "";
}
}
else if (byteCount > 1)
{
totalCount += 2;
if (totalCount > charNumber )
{
resultList.Add(mSubStr);
if (i == tempStr.Length - 1)
{
mSubStr = mChar;
resultList.Add(mSubStr);
}
else
{
totalCount = 2;
mSubStr = mChar;
}
}
else if (totalCount == charNumber)
{
mSubStr += mChar;
resultList.Add(mSubStr);
totalCount = 0;
mSubStr = "";
}
else if (i == tempStr.Length - 1)
{
mSubStr += mChar;
resultList.Add(mSubStr);
}
else
{
mSubStr += mChar;
}
}
}
return resultList;
}