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。