Zakładając, że chcesz tylko usunąć wszystkie znaki inne niż BMP, tj. wszystko, co ma punkt kodowy Unicode U+10000 i wyższy, możesz użyć wyrażenia regularnego, aby usunąć dowolny zamiennik UTF-16 jednostki kodu z ciągu. Na przykład:
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
}
}
Tutaj „Cs” to kategoria Unicode dla „substytutu”.
Wygląda na to, że Regex
działa w oparciu o jednostki kodu UTF-16, a nie punkty kodowe Unicode, w przeciwnym razie potrzebujesz innego podejścia.
Zwróć uwagę, że istnieją znaki spoza BMP inne niż emoji, ale podejrzewam, że napotkasz ten sam problem, gdy spróbujesz je zapisać.