Za předpokladu, že chcete pouze odstranit všechny znaky, které nejsou BMP, tj. cokoli s bodem kódu Unicode U+10000 a vyšším, můžete pomocí regulárního výrazu odstranit jakékoli náhradní znaky UTF-16 kódové jednotky z řetězce. Například:
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
}
}
Zde „Cs“ je kategorie Unicode pro „náhradní“.
Zdá se, že Regex
funguje na základě kódových jednotek UTF-16 spíše než bodů kódu Unicode, jinak byste potřebovali jiný přístup.
Všimněte si, že existují jiné znaky než BMP než emotikony, ale mám podezření, že při pokusu o jejich uložení zjistíte, že budou mít stejný problém.