Supondo que você queira apenas remover todos os caracteres não BMP, ou seja, qualquer coisa com um ponto de código Unicode de U+10000 e superior, você pode usar um regex para remover qualquer substituto UTF-16 unidades de código da string. Por exemplo:
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
}
}
Aqui "Cs" é a categoria Unicode para "substituto".
Parece que
Regex
funciona com base em unidades de código UTF-16 em vez de pontos de código Unicode, caso contrário, você precisaria de uma abordagem diferente. Observe que existem caracteres não BMP além de emoji, mas suspeito que você descobrirá que eles terão o mesmo problema ao tentar armazená-los.