Xóa khoảng trắng 2 đầu chuỗi kí tự kết hợp loại bỏ những kí tự vô hình C#

Hàm loại bỏ khoảng trắng 2 đầu khi xử lý chuỗi (hay còn biết đến với tên gọi Trim) không phải là vấn đề xa lạ. Nhưng có 1 số tình huống khiến ta đau đầu vì thế giới Unicode tồn tại 1 số kí tự vô hình (Zero-Width Space Character). Hãy xem 1 ví dụ sau:

            var text = " A"; //Hiển nhiên ta thấy có 1 khoảng trắng phía trước kí tự 'A'
            text.Select(p => $"U+{((int)p).ToString("x4")} ").ToList().ForEach(Console.Write);
            Console.WriteLine();
            var trimedText = text.Trim();
            trimedText.Select(p => $"U+{((int)p).ToString("x4")} ").ToList().ForEach(Console.Write);
            Console.WriteLine();

            var textContainingZeroWidthSpace = "‏A"; //Có 1 kí tự U+200F phía trước kí tự 'A' nhưng không nhìn thấy bằng mắt thường được. 1 số kí tự tương tự: U+200B, U+200C, U+200D, U+200E, U+FEFF
            textContainingZeroWidthSpace.Select(p => $"U+{((int)p).ToString("x4")} ").ToList().ForEach(Console.Write);
            Console.WriteLine();
            var trimedTextContainingZeroWidthSpace = textContainingZeroWidthSpace.Trim();
            trimedTextContainingZeroWidthSpace.Select(p => $"U+{((int)p).ToString("x4")} ").ToList().ForEach(Console.Write);
            Console.WriteLine();

Kết quả cho thấy hàm Trim không giúp ta loại bỏ kí tự vô hình đó đi:

(Trên msdn có để cập hàm Trim từ .NET framework 4.0 trở đi sẽ không loại bỏ, nhưng .NET 3.5 trở về trước thì có nhưng Khang chưa kiểm chứng điều này).
Vấn đề này nếu xảy ra sẽ dẫn đến các sai sót khi thực hiện những phép so sánh, và sẽ rất khó phát hiện nếu như những chuỗi kí tự này có lưu xuống database.
Giải pháp: Ngoài hàm Trim mặc định, ta sẽ xử lý thêm các trường hợp đó

    static class MyExtensions
    {
        public static char[] ZeroWidthSpaceCharacters = new char[]{'\u200b', '\u200c', '\u200d', '\u200e', '\u200f', '\ufeff'};

        public static string TrimZeroWidthSpace(this string str) //loại bỏ khoảng trắng và kí tự vô hình 2 đầu
        {
            return str.Trim().TrimStart(ZeroWidthSpaceCharacters).TrimEnd(ZeroWidthSpaceCharacters);
        }

        public static string TrimAndRemoveAllZeroWidthSpace(this string str) //loại bỏ khoảng trắng 2 đầu và mọi kí tự vô hình
        {
            string[] temp = str.Trim().Split(ZeroWidthSpaceCharacters, StringSplitOptions.RemoveEmptyEntries);
            return string.Join("", temp);
        }
    }

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất /  Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Đăng xuất /  Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất /  Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất /  Thay đổi )

Connecting to %s