Stai chiedendo informazioni su punti codice. In UTF-16 (C s 'char
#) ci sono solo due possibilità:
- Il personaggio è dal Piano base multilingue, ed è codificato da una singola unità di codice.
- Il personaggio è fuori della BMP, e codificati utilizzando una surrogare coppia di unità di codice alto-basso
Pertanto, assumendo la stringa è valida, restituisce una matrice di codice punti per un determinato stringa:
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();
}
un esempio con una coppia di surrogati
ed un carattere composto ñ
:
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
Ecco un altro esempio. Questi due punti di codice rappresenta una nota 32th musicale con un accento staccato, entrambe le coppie di surrogati:
ToCodePoints("\U0001D162\U0001D181"); //
// { 0x1d162, 0x1d181 } // ◌
Quando C-normalized, vengono scomposte in una testa nota, combinando gambo, combinando bandiera e combinando accento staccato, tutte le coppie di surrogati:
ToCodePoints("\U0001D162\U0001D181".Normalize()); //
// { 0x1d158, 0x1d165, 0x1d170, 0x1d181 } // ◌
Nota che leppie's solution non è corretto. La domanda è circa punti codice, non elementi di testo. Un elemento di testo è una combinazione di punti di codice che insieme formano un singolo grafo. Ad esempio, nell'esempio sopra, lo ñ
nella stringa è rappresentato da una minuscola latina n
seguita da una combinazione di tilde ̃◌
. La soluzione di Leppie elimina qualsiasi combinazione di caratteri che non può essere normalizzata in un singolo punto di codice.
▼: La tua soluzione scarta qualsiasi modificatore chara chiavi, e hai a che fare con _text elements_ e non _code points_. Ad esempio, il risultato di 'ExtractScalars (" El Ni \ u006E \ u0303o ")' convertito in una stringa sarebbe '' El Nino ''invece di' "El Niño" '. – Virtlink
@Virtlink: interessante. Dai documenti deve aver suonato come 'char.ConvertToUtf32 (string, int)' dovrebbe occuparsene. Modifica: I dannati dottori afferma che dovrebbe! https://msdn.microsoft.com/en-us/library/z2ys180b(v=vs.110).aspx – leppie
@Virtlink: Ok, non tratta i caratteri composti, ma fa per le coppie surrogate. – leppie