例如:UI显示规则:英文字符长度==1,中文字符长度==2,限制字符串显示长度不超过10,超出部分用"···"代替
playerNameText.text = StringUtility.AbbrevStringWithinLength("玩家de名字可能会很长的~",10,"···");
//结果:"玩家de名字···"
/// <summary>
/// 化简字符串长度
/// </summary>
/// <param name="targetStr"></param>
/// <param name="targetLength">目标长度,英文字符==1,中文字符==2</param>
/// <returns></returns>
public static string AbbrevStringWithinLength(string targetStr,int targetLength,string abbrevPostfix)
{
//C#实际统计:一个中文字符长度==1,英文字符长度==1
//UI显示要求:一个中文字符长度==2,英文字符长度==1
//校验参数
if(string.IsNullOrEmpty(targetStr) || targetLength <= 0)
return targetStr;
//字符串长度 * 2 <= 目标长度,即使是全中文也在长度范围内
if(targetStr.Length * 2 <= targetLength)
return targetStr;
//遍历字符
char[] chars = targetStr.ToCharArray();
int curLen = 0;
for(int i = 0; i < chars.Length; i++)
{
//累加字符串长度
if(chars[i] >= 0x4e00 && chars[i] <= 0x9fbb)
curLen += 2;
else
curLen += 1;
//如果当前位置累计长度超过目标长度,取0~i-1,即Substring(0,i)
if(curLen > targetLength)
return targetStr.Substring(0,i) + abbrevPostfix;
}
return targetStr;
}