2017-02-14 21 views
7

Nếu tôi có một chuỗi như "123‍‍‍", làm thế nào tôi có thể chia nó thành một mảng, trông giống như ["", "1", "2", "3", "‍‍‍"]? Nếu tôi sử dụng ToCharArray() Biểu tượng cảm xúc đầu tiên được chia thành 2 ký tự và biểu tượng thứ hai thành 7 ký tự.Làm cách nào để tách chuỗi Unicode thành nhiều ký tự Unicode trong C#?

Cập nhật

Giải pháp bây giờ trông như thế này:

public static List<string> GetCharacters(string text) 
{ 
    char[] ca = text.ToCharArray(); 
    List<string> characters = new List<string>(); 
    for (int i = 0; i < ca.Length; i++) 
    { 
     char c = ca[i]; 
     if (c > 65000) continue; 
     if (char.IsHighSurrogate(c)) 
     { 
      i++; 
      characters.Add(new string(new[] { c, ca[i] })); 
     } 
     else 
      characters.Add(new string(new[] { c })); 
    } 
    return characters; 
} 

Xin lưu ý rằng, như đã đề cập trong các ý kiến, nó không hoạt động cho các biểu tượng cảm xúc trong gia đình. Nó chỉ hoạt động cho các biểu tượng cảm xúc có 2 ký tự trở xuống. Đầu ra của ví dụ sẽ là: ["", "1", "2", "3", "‍", "‍", "‍", ""]

+1

'‍ + ‍ + ‍ + = ‍‍‍' vui nhộn, không biết rằng – fubo

+1

Điều này xảy ra như thế nào? Biểu tượng cảm xúc dành cho công cụ hiển thị văn bản. Xử lý văn bản có chứa biểu tượng cảm xúc tương đương với niềm vui khi xử lý văn bản tiếng Trung. Hoặc Zalgo, nếu bạn muốn thử thách thực sự :) Nhận ra người thay thế không phải là khoa học tên lửa khác, hãy sử dụng Char.IsLowSurrogate(). –

Trả lời

5

.NET đại diện cho chuỗi như là một chuỗi các thành phần UTF-16. Các điểm mã Unicode bên ngoài Base Multilingual Plane (BMP) sẽ được chia thành một đại diện cao và thấp. 10 bit thấp hơn của mỗi hình thức chiếm một nửa giá trị điểm mã thực.

Có những người giúp đỡ để phát hiện những người thay thế này (ví dụ: Char.IsLowSurrogate).

Bạn cần tự mình xử lý.

+0

Bạn có tài liệu hoặc bài đăng về cách các chức năng thay thế này hoạt động không? – mjw

+1

@mjw Xem chỉnh sửa (và cảm ơn người nhận xét về câu hỏi để tiết kiệm cho tôi nhớ). – Richard

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