Pytasz o punktów kodowych. W UTF-16 (C# 's char
) istnieją tylko dwie możliwości:
- Znak jest z Podstawowe Multilingual Plane i jest kodowany przez pojedynczą jednostkę kodu.
- charakter jest poza BMP i kodowane przy użyciu surrogare wysokie niskie parą zespołów kodów
związku z tym, zakładając, że łańcuch jest ważny, to zwraca tablicy kodu punktów dla danego ciąg:
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();
}
przykładem z zastępczym pary
i złożonego charakteru ñ
:
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
Oto kolejny przykład. Te dwa punkty kod reprezentuje 32th nuta z akcent staccato zarówno zastępczych parach
ToCodePoints("\U0001D162\U0001D181"); //
// { 0x1d162, 0x1d181 } // ◌
Gdy C-normalized, są rozkładane do notehead, łącząc trzpień, łączenie flag i łączenie akcent staccato wszelkie zastępczych parach
ToCodePoints("\U0001D162\U0001D181".Normalize()); //
// { 0x1d158, 0x1d165, 0x1d170, 0x1d181 } // ◌
Zauważ, że leppie's solution nie jest poprawna. Pytanie dotyczy punktów kodowych, a nie elementów tekstowych. Element tekstowy to kombinacja punktów kodowych, które razem tworzą pojedynczy grafem. Na przykład w powyższym przykładzie wartość ñ
w łańcuchu jest reprezentowana przez łacińską małą literę n
, a następnie kombinację tyldy ̃◌
. Rozwiązanie Leppie'ego odrzuca wszystkie kombinacje znaków, których nie można znormalizować w jeden punkt kodowy.
▼: Twoje rozwiązanie odrzuca wszelkie modyfikatory chara cters, i masz do czynienia z _text elements_, a nie _code points_. Na przykład wynikiem 'ExtractScalars (" El Ni \ u006E \ u0303o ")' przekonwertowane z powrotem na ciąg znaków byłoby '" El Nino "' zamiast '" El Niño "'. – Virtlink
@Virtlink: Interesujące. Z dokumentów musi to brzmieć jak 'char.ConvertToUtf32 (string, int)' powinien sobie z tym poradzić. Edytuj: Cholerni doktorzy twierdzą, że powinno! https://msdn.microsoft.com/en-us/library/z2ys180b(v=vs.110).aspx – leppie
@Virtlink: Ok, nie dotyczy znaków złożonych, ale nie zastępuje par zastępczych. – leppie