在C#中转换为字节时,如何截断字符串?

在C#中转换为字节时,如何截断字符串?,c#,.net,arrays,string,truncate,C#,.net,Arrays,String,Truncate,我想将一个字符串放入字节数组,但该字符串可能太大,无法容纳。如果它太大,我希望将尽可能多的字符串放入数组中。是否有一个有效的方法来找出有多少字符将适合?为了在没有中间字符的情况下截断一个字符串到UTF8字节数组,我使用这个: static string Truncate(string s, int maxLength) { if (Encoding.UTF8.GetByteCount(s) <= maxLength) return s; var cs = s

我想将一个字符串放入字节数组,但该字符串可能太大,无法容纳。如果它太大,我希望将尽可能多的字符串放入数组中。是否有一个有效的方法来找出有多少字符将适合?

为了在没有中间字符的情况下截断一个字符串到UTF8字节数组,我使用这个:

static string Truncate(string s, int maxLength) {
    if (Encoding.UTF8.GetByteCount(s) <= maxLength)
        return s;
    var cs = s.ToCharArray();
    int length = 0;
    int i = 0;
    while (i < cs.Length){
        int charSize = 1;
        if (i < (cs.Length - 1) && char.IsSurrogate(cs[i]))
            charSize = 2;
        int byteSize = Encoding.UTF8.GetByteCount(cs, i, charSize);
        if ((byteSize + length) <= maxLength){
            i = i + charSize;
            length += byteSize;
        }
        else
            break;
    }
    return s.Substring(0, i);
}
静态字符串截断(字符串s,int maxLength){

如果(Encoding.UTF8.GetByteCount)您应该使用Encoding类正确地转换为字节数组?所有编码对象都有一个重写的方法GetMaxCharCount,它将为您提供“通过解码指定字节数产生的最大字符数”您应该能够使用此值修剪字符串并对其进行正确编码。

有效的方法是查找每个字符需要多少字节(悲观地说)

Encoding.GetMaxByteCount(1);
然后将字符串大小除以结果,然后用

public virtual int Encoding.GetBytes (
 string s,
 int charIndex,
 int charCount,
 byte[] bytes,
 int byteIndex
)
如果您想使用更少的内存,请使用

Encoding.GetByteCount(string);

但是这是一个慢得多的方法。

在.NET中的Encoding类有一个名为
GetByteCount
的方法,它可以接受字符串或字符[]。如果传入1个字符,它将告诉您在使用的任何编码中,该1个字符需要多少字节


方法
GetMaxByteCount
速度更快,但它会执行最坏情况下的计算,返回的数字可能高于实际需要的数字。

如果他的限制是字节数,则此方法无效。(仅当限制是字符数时)