Ако приемем, че просто искате да премахнете всички знаци, които не са BMP, т.е. всичко с кодова точка на Unicode от U+10000 и по-висока, можете да използвате регулярен израз, за да премахнете всеки UTF-16 сурогат кодови единици от низа. Например:
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
}
}
Тук „Cs“ е категорията на Unicode за „сурогат“.
Изглежда, че Regex
работи въз основа на кодови единици UTF-16, а не на кодови точки на Unicode, в противен случай ще ви е необходим различен подход.
Имайте предвид, че има знаци, различни от BMP, различни от емоджи, но подозирам, че ще откриете, че те ще имат същия проблем, когато се опитате да ги съхраните.