C# 完美截断字符串代码(中文+非中文)

江岸
江岸
发布时间:2026-10-15 | 4人浏览过
原创

在 C# Web 开发或数据处理中,直接按字节或字符数截断包含中文的字符串容易导致乱码或显示不完整。本文介绍一种通过判断字符 ASCII/Unicode 范围来动态计算长度的策略,编写一个名为 Truncation 的扩展方法,实现对中英文混合字符串的完美截断,确保视觉效果整齐且无乱码。

问题背景:中英文混排截断难题

在使用 string.Substring 进行简单截断时,若目标长度恰好落在某个中文字符的中间,或者未考虑中文占用空间较大(通常视为双字节或宽字符)而英文为单字节的情况,会导致:

  • 出现乱码或占位符(如�);
  • 前端页面排版错位;
  • 视觉长度不一致。

解决思路通常有两种:一是基于字节数(UTF-8)截断后补全编码,二是基于“视觉字符”逻辑,将中文和英文同等视为“一个显示单位”,并在末尾添加省略号表示内容被截断。下面展示的代码采用第二种逻辑,简单有效。

实现方案:C# 扩展方法 Truncation

以下代码定义了一个作用于 HtmlHelper 类的静态扩展方法。其核心逻辑是遍历字符串,当遇到 ASCII 码大于 128 的字符(即中文等宽字符)时,减少剩余的目标长度配额,从而保证截断点始终在字符边界上,避免截断半个汉字。

public static string Truncation(this HtmlHelper htmlHelper, string str, int len)
{
    // 1. 安全检查:处理空值或无效长度
    if (str == null || str.Length == 0 || len <= 0)
    {
        return string.Empty;
    }

    int l = str.Length;
    int clen = 0;

    // 2. 计算实际可截取的最大字符索引
    // 逻辑:len 代表期望显示的“字”数。如果遇到中文(码值 > 128),
    // 则消耗 1 个名额但只前进 1 步索引,相当于把中文当作普通字符处理,
    // 同时通过减小 len 来平衡循环结束条件。
    while (clen < len && clen < l)
    {
        // 每遇到一个中文,则将目标长度减一
        if ((int)str[clen] > 128) { len--; }
        clen++;
    }

    // 3. 判断是否发生截断
    if (clen < l)
    {
        // 如果已遍历的字符数小于原串长度,说明需要截断
        return str.Substring(0, clen) + "...";
    }
    else
    {
        // 否则返回原字符串,无需截断
        return str;
    }
}

使用说明与注意事项

入口位置:
此代码需放置在包含 System.Web.Mvc(WebForms/MVC 上下文)或相应命名空间的类库中。由于使用了 this HtmlHelper 作为接收者,它主要设计用于 ASP.NET MVC 视图中的 HTML 辅助场景。

重要参数解释:

  • str:待处理的原始字符串。
  • len:希望显示的字符个数(中英文均算作 1 个计数)。

完成判断:
编译通过即可调用。例如在视图中使用 @Html.Truncation("Hello 世界 Hello", 5) 将返回类似 Hello... 的结果(具体取决于字符索引计算细节,此算法确保不切断中文内部)。

风险提醒:编码假设

该代码通过 (int)char > 128 来判断是否为非 ASCII 字符(主要是中文)。这种方法依赖于运行环境默认使用 UTF-8 或 GBK 等常见多字节编码。
对于某些特殊的 Emoji 或极少用汉字,其 Unicode 码位远超 128,代码同样能正确识别为非单字节字符并进行截断保护,但对于极个别特殊符号(如部分 Combining Characters),可能需要更复杂的 StringInfo 处理。不过对于绝大多数 Web 应用场景,此方法已足够完善且性能高效。

简要总结

这段代码通过简单的 ASCII 值判断和计数器调整,解决了 C# 中常见的中英混合字符串截断乱码问题。它不仅保证了内容的完整性,还通过统一中英文计数的逻辑,使输出更加整洁美观。以上就是 C# 完美截断字符串代码(中文+非中文) 的详细内容,更多关于 C# 字符串处理、ASP.NET MVC 扩展方法优化等资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表