2013-01-02 39 views
7

Tôi đã chuỗi sau:Đo chiều dài của chuỗi chứa ký tự rộng

友又 

Các tương ứng UTF-16 đại diện (ít về cuối nhỏ) là

CB 53 40 D8 87 DC C8 53 
\___/ \_________/ \___/ 
    友    又 

"友又".Length lợi nhuận 4, vì chuỗi được lưu trữ dưới dạng 4 ký tự 2 byte bằng CLR.

Làm cách nào để đo độ dài của chuỗi? Làm cách nào để chia nó thành { "友", "", "又" }?

Trả lời

11

Như documented:

Thuộc tính Length trả về số Char đối tượng trong trường hợp này, không phải là số lượng ký tự Unicode. Lý do là một ký tự Unicode có thể được đại diện bởi nhiều hơn một Char. Sử dụng lớp System.Globalization.StringInfo để làm việc với mỗi ký tự Unicode thay vì mỗi Char.


Bắt dài:

new System.Globalization.StringInfo("友又").LengthInTextElements 

Bắt mỗi ký tự Unicode là documented here, nhưng nó thuận tiện hơn nhiều để thực hiện một phương pháp khuyến nông:

public static IEnumerable<string> TextElements(this string s) { 
    var en = System.Globalization.StringInfo.GetTextElementEnumerator(s); 

    while (en.MoveNext()) 
    { 
     yield return en.GetTextElement(); 
    } 
} 

và sử dụng nó trong một số foreach hoặc trong LINQ tuyên bố:

foreach (string segment in "友又".TextElements()) 
{ 
    Console.WriteLine(segment); 
} 

mà cũng có thể được sử dụng cho chiều dài:

Console.WriteLine("友又".TextElements().Count()); 
+0

Đó là tuyệt vời. Cảm ơn rất nhiều. Tôi có sử dụng 'GetTextElementEnumerator' để tách chuỗi không? –

+0

@ Clément Có, bạn sẽ, như [tài liệu] (http://msdn.microsoft.com/en-us/library/x2f3k4f6.aspx). – GSerg

+0

Cảm ơn bạn một lần nữa vì đã giúp đỡ. –

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