Giả sử bạn chỉ muốn xóa tất cả các ký tự không phải BMP, tức là bất kỳ thứ gì có điểm mã Unicode là U + 10000 trở lên, bạn có thể sử dụng regex để xóa mọi UTF-16 đại diện mã đơn vị từ chuỗi. Ví dụ:
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
}
}
Ở đây "Cs" là danh mục Unicode cho "người thay thế".
Có vẻ như Regex
hoạt động dựa trên các đơn vị mã UTF-16 thay vì các điểm mã Unicode, nếu không, bạn cần một cách tiếp cận khác.
Lưu ý rằng có các ký tự không phải BMP ngoài biểu tượng cảm xúc, nhưng tôi nghi ngờ bạn sẽ thấy chúng sẽ gặp vấn đề tương tự khi bạn cố gắng lưu trữ chúng.