Usted está preguntando acerca de puntos de código. En UTF-16 (C# 's char
) sólo hay dos posibilidades:
- El personaje es desde el plano multilingüe básica, y se codifica por una sola unidad de código.
- El carácter está fuera del BMP, y codificado utilizando un par surrogare alto-bajo de unidades de código
Por lo tanto, suponiendo que la cadena es válida, este devuelve una matriz de código puntos para un determinado cadena:
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 ejemplo con un par suplente
y un carácter compuesto ñ
:
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
Aquí hay otro ejemplo. Estos dos puntos de código representa una nota 32 ª musical con un acento staccato, ambos pares suplentes:
ToCodePoints("\U0001D162\U0001D181"); //
// { 0x1d162, 0x1d181 } // ◌
Cuando C-normalized, que se descomponen en una cabeza de nota, la combinación de vástago, la combinación de la bandera y la combinación de acento-staccato, todos los pares suplentes:
ToCodePoints("\U0001D162\U0001D181".Normalize()); //
// { 0x1d158, 0x1d165, 0x1d170, 0x1d181 } // ◌
Tenga en cuenta que leppie's solution no es correcto. La pregunta es sobre puntos de código, no elementos de texto. Un elemento de texto es una combinación de puntos de código que juntos forman un solo grafema. Por ejemplo, en el ejemplo anterior, el ñ
en la cadena está representado por una minúscula latina n
seguida de una tilde combinada ̃◌
. La solución de Leppie descarta cualquier combinación de caracteres que no se puedan normalizar en un solo punto de código.
▼: Su solución descarta cualquier chara de modificador cters, y se trata de _text elements_ y no _code points_. Por ejemplo, el resultado de 'ExtractScalars (" El Ni \ u006E \ u0303o ")' convertido de nuevo a una cadena sería '" El Niño "' en lugar de '" El Niño "'. – Virtlink
@Virtlink: Interesante. Desde los documentos, debe haber sonado como 'char.ConvertToUtf32 (string, int)' debería tratarlo. Editar: ¡Los malditos documentos dicen que debería! https://msdn.microsoft.com/en-us/library/z2ys180b(v=vs.110).aspx – leppie
@Virtlink: Ok, no se trata de caracteres compuestos, pero lo hace para los pares suplentes. – leppie