C#截取指定字节长度的中英文混合字符串
在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#字符串处理的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









