Tất cả phụ thuộc vào
So sánh các chuỗi unicode là khó:
Việc thực hiện tìm kiếm và so sánh chuỗi Unicode trong phần mềm xử lý văn bản phải tính đến sự hiện diện của các điểm mã tương đương. Nếu không có tính năng này, người dùng đang tìm kiếm một chuỗi điểm mã cụ thể sẽ không thể tìm thấy các glyph không thể phân biệt trực quan khác có biểu diễn điểm mã khác, nhưng tương đương về mặt quy tắc.
xem: http://en.wikipedia.org/wiki/Unicode_equivalence
Nếu bạn đang cố gắng so sánh 2 chuỗi unicode theo cách không phân biệt chữ hoa chữ thường và muốn nó hoạt động MỌI NƠI , bạn có một vấn đề không thể xảy ra.
Ví dụ kinh điển là i Thổ Nhĩ Kỳ , khi chữ hoa trở thành chữ (chú ý dấu chấm)
Theo mặc định, khung .Net thường sử dụng CurrentCARM cho các hàm liên quan đến chuỗi, với một ngoại lệ rất quan trọng .Equals
là sử dụng phép so sánh thứ tự (byte theo byte).
Điều này dẫn, theo thiết kế, đến các hàm chuỗi khác nhau hoạt động khác nhau tùy thuộc vào văn hóa của máy tính.
Tuy nhiên, đôi khi chúng tôi muốn một "mục đích chung", trường hợp không nhạy cảm, so sánh.
Ví dụ, bạn có thể muốn so sánh chuỗi của mình hoạt động theo cùng một cách, bất kể ứng dụng của bạn được cài đặt trên máy tính nào.
Để đạt được điều này, chúng tôi có 3 lựa chọn:
- Đặt văn hóa rõ ràng và thực hiện so sánh không phân biệt chữ hoa chữ thường bằng các quy tắc tương đương unicode.
- Đặt văn hóa thành Văn hóa bất biến và thực hiện so sánh không phân biệt chữ hoa chữ thường bằng các quy tắc tương đương unicode.
- Sử dụng OrdinalIgnoreCase sẽ viết hoa chuỗi bằng cách sử dụng InvariantCARM và sau đó thực hiện so sánh byte theo byte.
Các quy tắc tương đương Unicode rất phức tạp, có nghĩa là sử dụng phương pháp 1) hoặc 2) đắt hơn OrdinalIgnoreCase
. Thực tế là OrdinalIgnoreCase
không thực hiện bất kỳ chuẩn hóa unicode đặc biệt nào, có nghĩa là một số chuỗi kết xuất theo cùng một cách trên màn hình máy tính, sẽ không được coi là giống hệt nhau. Ví dụ: "\u0061\u030a"
và "\u00e5"
cả hai kết xuất å. Tuy nhiên trong một so sánh thứ tự sẽ được coi là khác nhau.
Mà bạn chọn rất nhiều phụ thuộc vào ứng dụng bạn đang xây dựng.
- Nếu tôi đang viết một ứng dụng kinh doanh chỉ dành cho người dùng Thổ Nhĩ Kỳ, tôi chắc chắn sẽ sử dụng phương pháp 1.
- Nếu tôi chỉ cần một so sánh không nhạy cảm trường hợp "giả" đơn giản, ví dụ như một tên cột trong db, thường là tiếng Anh, tôi có thể sẽ sử dụng phương thức 3.
Microsoft có bộ khuyến nghị của họ với các hướng dẫn rõ ràng. Tuy nhiên, điều thực sự quan trọng là phải hiểu khái niệm tương đương unicode trước khi tiếp cận những vấn đề này.
Ngoài ra, xin lưu ý rằng OrdinalIgnoreCase là một loại quái thú rất đặc biệt , đó là chọn và chọn một chút so sánh thông thường với một số khía cạnh hỗn hợp trong từ vựng. Điều này có thể gây nhầm lẫn.