Bạn đang hỏi về điểm mã. Trong UTF-16 (C# 's char
) chỉ có hai khả năng:
- Nhân vật là từ Basic Multilingual Plane, và được mã hóa bởi một đơn vị mã duy nhất.
- Nhân vật nằm ngoài BMP, và mã hóa sử dụng một cặp cao-thấp surrogare của đơn vị mã
Vì vậy, giả sử chuỗi là hợp lệ, này trả về một mảng mã điểm cho một định chuỗi:
public static int[] ToCodePoints(string str)
{
if (str == null)
throw new ArgumentNullException("str");
var codePoints = new List<int>(str.Length);
for (int i = 0; i < str.Length; i++)
{
codePoints.Add(Char.ConvertToUtf32(str, i));
if (Char.IsHighSurrogate(str[i]))
i += 1;
}
return codePoints.ToArray();
}
một ví dụ với một cặp thay thế
và một nhân vật sáng tác ñ
:
ToCodePoints("\U0001F300 El Ni\u006E\u0303o"); // El Niño
// { 0x1f300, 0x20, 0x45, 0x6c, 0x20, 0x4e, 0x69, 0x6e, 0x303, 0x6f } // E l N i n ̃◌ o
Đây là một ví dụ khác. Hai điểm mã đại diện cho một lưu ý 32th âm nhạc với một giọng ngắt, cả hai cặp thay thế:
ToCodePoints("\U0001D162\U0001D181"); //
// { 0x1d162, 0x1d181 } // ◌
Khi C-normalized, họ được chia ra thành một Notehead, kết hợp gốc, kết hợp cờ và kết hợp giọng-ngắt, tất cả các cặp thay thế:
ToCodePoints("\U0001D162\U0001D181".Normalize()); //
// { 0x1d158, 0x1d165, 0x1d170, 0x1d181 } // ◌
Lưu ý rằng leppie's solution là không đúng. Câu hỏi là về các điểm mã, không phải yếu tố văn bản. Phần tử văn bản là sự kết hợp các điểm mã với nhau tạo thành một biểu đồ đơn. Ví dụ: trong ví dụ trên, số ñ
trong chuỗi được thể hiện bằng chữ thường Latinh n
theo sau là dấu ngã kết hợp ̃◌
. Giải pháp của Leppie loại bỏ bất kỳ ký tự kết hợp nào không thể được chuẩn hóa thành một điểm mã duy nhất.
▼: Giải pháp của bạn loại bỏ bất kỳ bộ sửa đổi nào cters, và bạn đang xử lý _text elements_ và không phải là _code points_. Ví dụ, kết quả của 'ExtractScalars (" El Ni \ u006E \ u0303o ")' được chuyển đổi thành một chuỗi sẽ là '" El Nino "' thay vì '" El Niño "'. – Virtlink
@Virtlink: Thú vị. Từ các tài liệu, nó phải có âm thanh như 'char.ConvertToUtf32 (string, int)' nên xử lý nó. Chỉnh sửa: Các tài liệu chết tiệt tuyên bố nó nên! https://msdn.microsoft.com/en-us/library/z2ys180b(v=vs.110).aspx – leppie
@Virtlink: Ok, nó không xử lý các ký tự kết hợp, nhưng cho các cặp thay thế. – leppie