2008-08-29 50 views

回答

5

爲了在字符的中間截斷字符串到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); 
} 

返回的字符串然後可以安全地轉移到長度最大長度的字節數組。

2

你應該使用Encoding類來轉換爲字節數組嗎?所有Encoding對象都有一個重寫方法GetMaxCharCount,它會給你「解碼指定字節數所產生的最大字符數」。你應該能夠使用這個值來修剪你的字符串並對它進行正確的編碼。

+0

如果他的限制是字節數,則這不起作用。 (只有當限制是字符數時) – roim 2014-02-11 20:13:33

1

有效的方法是找出多少(悲觀)字節,你將每個字符需要

Encoding.GetMaxByteCount(1); 

然後將您的字符串大小的結果,然後將這麼多字符

public virtual int Encoding.GetBytes (
string s, 
int charIndex, 
int charCount, 
byte[] bytes, 
int byteIndex 
) 

如果你想使用較少的內存使用

Encoding.GetByteCount(string); 

但這是一個更慢的方法。

1

在.NET編碼類有一個叫做GetByteCount方法,該方法可以在一個字符串或燒焦[]。如果你傳入1個字符,它會告訴你需要多少個字節用於你使用的任何編碼。

方法GetMaxByteCount比較快,但是它做了最壞的情況計算,其可能獲得超過實際需要一個較大的數字。

1

Cookey,你的代碼並沒有做你明顯認爲的事情。在您的案例中預分配字節緩衝區是純粹的浪費,因爲它不會被使用。相反,您的分配會丟棄分配的內存,並重置arr引用以指向另一個緩衝區,因爲Encoding.GetBytes會返回一個新數組。

相關問題