Suponiendo que solo desea eliminar todos los caracteres que no sean BMP, es decir, cualquier cosa con un punto de código Unicode de U+10000 y superior, puede usar una expresión regular para eliminar cualquier sustituto UTF-16 unidades de código de la cadena. Por ejemplo:
using System;
using System.Text.RegularExpressions;
class Test
{
static void Main(string[] args)
{
string text = "x\U0001F310y";
Console.WriteLine(text.Length); // 4
string result = Regex.Replace(text, @"\p{Cs}", "");
Console.WriteLine(result); // 2
}
}
Aquí "Cs" es la categoría Unicode para "sustituto".
Parece que Regex
funciona en base a unidades de código UTF-16 en lugar de puntos de código Unicode; de lo contrario, necesitaría un enfoque diferente.
Tenga en cuenta que hay caracteres que no son BMP además de emoji, pero sospecho que encontrará que tendrán el mismo problema cuando intente almacenarlos.