C#截取指定字节长度的中英文混合字符串

小岛来信
小岛来信
发布时间:2026-10-14 | 2人浏览过
原创

在C#开发中,处理数据库存储或界面显示限制时,经常需要按字节而非字符个数来截取包含中文的字符串。由于汉字通常占2个字节而英文字母占1个字节,直接截取字符可能导致截断。本文提供基于Encoding.Default的判断逻辑和完整代码实现。

问题背景与解决方案

在中英文混合场景下,string.Length属性返回的是字符数量,而非字节数。若前端或数据库要求固定字节宽度(例如10字节),直接使用Substring容易切断多字节字符导致乱码。

解决方案是遍历字符串中的每个字符,计算其实际占用字节数。当累计字节数达到目标上限时停止追加,从而确保截取后的字符串完整性。

核心实现代码

以下代码封装了两个静态方法:StrLength用于计算准确的字节长度,StrCut用于执行截取操作。逻辑基于Windows默认编码(通常为GBK)进行验证。

复制代码 代码如下:
using System.Text.RegularExpressions;
using System.Text;

/// 
/// 字符串长度(按字节算)
/// 
/// 
/// 
static int StrLength(string str)
{
    int len = 0;
    byte[] b;

    for (int i = 0; i < str.Length; i++)
    {
        b = Encoding.Default.GetBytes(str.Substring(i,1));
        if (b.Length > 1)
            len += 2;
        else
            len++;
    }

    return len;
}

/// 
/// 截取指定长度字符串(按字节算)
/// 
/// 
/// 
/// 
static string StrCut(string str, int length)
{
    int len = 0;
    byte[] b;
    StringBuilder sb = new StringBuilder();

    for (int i = 0; i < str.Length; i++)
    {
        b = Encoding.Default.GetBytes(str.Substring(i, 1));
        if (b.Length > 1)
            len += 2;
        else
            len++;

        if (len >= length)
            break;

        sb.Append(str[i]);
    }

    return sb.ToString();
}

代码使用说明

第1步:引入必要的命名空间

确保文件头部包含System.Text以支持StringBuilder和Encoding类。

第2步:调用截取方法

在业务逻辑中调用StrCut函数,传入原始字符串和目标字节长度。例如:

  • 输入字符串:"Hello World! 你好"
  • 指定长度:10
  • 预期结果:"Hello Worl"(注意:如果截断点恰好落在汉字中间,此算法会停止在截断点之前,保持字符边界完整,避免产生半个汉字)

注意事项

Encoding.Default在非中文Windows环境下可能对应ISO-8859-1或其他编码,导致汉字被识别为1字节,进而引发计算误差。对于纯国际化部署的应用,建议根据目标数据库的具体编码规范(如UTF-8)调整获取字节的方式。

以上就是C#截取中英文混合指定长度字符串的详细内容,更多关于C#字符串处理的资料请关注本站其它相关文章!

相关标签:

本站声明

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

Python 相关产品和应用

全部下载

专题列表