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。
浙公網安備 33010602011771號