2008-08-29 40 views

Trả lời

5

Để cắt một chuỗi để một mảng UTF8 byte mà không cần tách ở giữa một nhân vật tôi sử dụng này:

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); 
} 

Chuỗi trở có thể sau đó được chuyển an toàn đến một mảng byte chiều dài maxLength.

2

Bạn nên sử dụng lớp Mã hóa để chuyển đổi thành mảng byte đúng không? Tất cả các đối tượng Mã hóa đều có phương thức ghi đè GetMaxCharCount, sẽ cung cấp cho bạn "Số ký tự tối đa được tạo ra bằng cách giải mã số byte được chỉ định." Bạn sẽ có thể sử dụng giá trị này để cắt chuỗi của bạn và mã hóa chính xác nó.

+0

Điều này không hoạt động nếu giới hạn của anh là số byte. (Chỉ khi giới hạn là số ký tự) – roim

1

cách hiệu quả sẽ là việc tìm kiếm bao nhiêu (bi quan) byte, bạn sẽ cần mỗi nhân vật với

Encoding.GetMaxByteCount(1); 

sau đó chia cho kích thước chuỗi của bạn bằng cách kết quả, sau đó chuyển đổi mà nhân vật nhiều với

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

Nếu bạn muốn sử dụng ít bộ nhớ hơn, hãy sử dụng

Encoding.GetByteCount(string); 

nhưng đó là một phương pháp chậm hơn nhiều.

1

Lớp mã hóa trong .NET có phương thức được gọi là GetByteCount có thể lấy một chuỗi hoặc ký tự []. Nếu bạn vượt qua trong 1 ký tự, nó sẽ cho bạn biết có bao nhiêu byte là cần thiết cho rằng 1 ký tự trong bất kỳ mã hóa bạn đang sử dụng.

Phương pháp GetMaxByteCount nhanh hơn, nhưng tính toán trường hợp xấu nhất có thể trả lại số cao hơn số thực sự cần thiết.

1

Cookey, mã của bạn không làm những gì bạn nghĩ rõ ràng. Việc cấp phát bộ đệm byte trong trường hợp của bạn là chất thải thuần túy vì nó sẽ không được sử dụng. Thay vào đó, nhiệm vụ của bạn giảm bộ nhớ được cấp phát và đặt lại tham chiếu arr để trỏ đến bộ đệm khác vì Encoding.GetBytes trả về một mảng mới.

Các vấn đề liên quan