C#按照指定长度分割中英文字符串

最近有一个需求:玩家发的不同长度文字,需要自适应行数。

初步实现想法很简单,直接获取字符数均分行数,再利用string.substring()切割即可。但是显而易见,由于一般字体下,中文显示宽度一般是两个数字|字母的宽度,所以直接分割的每一行元素个数一致,但是显示长度却长短不一。

解决办法:利用递归实现此方法:

 

private void GetSubStringList(string str,int length,List<string> list)
{
     string content = "";
     string nextSub = "";
     byte[] content    = System.text.Encoding.Unicode.GetBytes(str);
     if (length>content.Length)
    {
        contentSub = str;
        if (contentSub != "")
        {
            list.Add(contentSub);
        }
    }
    else
    {
        int index = 0;
        for (int i = 0;i<length*2 &&i<str.Length*2;i++   )
        {
            if ( i%2 != 0 && content[i] == 0)
            {
                index++;
            }
        }
        index += (int)Math.floor((double)(length - index)/2f); //汉字数*2+字符数=length
        if ( index >str.Length)
        {
            index = str.Length;
        }
        contentSub = str.Substring(0,index);
        nextSub = str.Substring(index);
        list.Add(contentSub);
        
        GetSubStringList(nextSub,length,list);
    }
}

  参数:str:需要切割的字符串;

       length:每一行显示的长度(字节数);

       list:保存每一行的内容,使用时遍历取出即可。

 

  主要利用到 System.text.Encoding.Unicode.GetBytes()方法,将string字符串转换成Unicode编码的byte数组。Unicode编码方式中:字符类型的第二字节为0;汉字第二字节大于0。

posted @ 2015-11-10 16:44  庐望  阅读(5943)  评论(0编辑  收藏  举报