public static string SubCutString(this string input, int length, string substitute = "...") { if (string.IsNullOrEmpty(input)) { return string.Empty; } //初始化字符串的字符数组 Char[] arr; //如果字符串的真实长度小于或者等于要截取的字符串长度就直接返回源字符串 if (GetStringLength(input, out arr) <= length) { return input; } //获取不包括substitute的长度 if (string.IsNullOrEmpty(substitute)) { length -= Encoding.UTF8.GetBytes("...").Length; } else { length -= Encoding.UTF8.GetBytes(substitute).Length; } //分析出来的字符字节长度 double byteLength = 0; //拼装字符串类 var subBuilder = new StringBuilder(); //循环判断每个字符是属于双字节还是单字节(大写英文字母为1.5个字节) for (var i = 0; i < arr.Length; i++) { //判断双字节 var doubleByteMatch = DoubleByteRegex.Match(arr[i].ToString()); if (doubleByteMatch.Success) { byteLength += 2; } else { //判断是否为大写 var caseMatch = CaseRegex.Match(arr[i].ToString()); if (caseMatch.Success) { byteLength += 1.5; } else { byteLength++; } } if (byteLength > length) { break; } subBuilder.Append(arr[i]); } subBuilder.Append(substitute); return subBuilder.ToString(); }