2010-05-20 13 views
8

Khi so sánh "Île" và "Ile", C# không coi đây là giống nhau.Sự cố khi so sánh ký tự tiếng Pháp Î

string.Equals("Île", "Ile", StringComparison.InvariantCultureIgnoreCase) 

Đối với tất cả các ký tự có dấu trọng âm khác, tôi đã xem xét các tác phẩm so sánh.

Có chức năng so sánh nào khác tôi nên sử dụng không?

Trả lời

6

Bạn đang chỉ định so sánh các chuỗi bằng quy tắc so sánh của văn hóa bất biến. Rõ ràng, trong văn hóa bất biến, hai dây không được coi là bình đẳng.

Bạn có thể so sánh chúng trong một cách văn hóa đặc thù sử dụng String.Compare và cung cấp các văn hóa mà bạn muốn so sánh các chuỗi:

if(String.Compare("Île", "Ile", new CultureInfo("fr-FR"), CompareOptions.None)==0) 

Xin lưu ý rằng trong văn hóa Pháp, những chuỗi cũng là được coi là khác nhau. Tôi đưa vào ví dụ để hiển thị, rằng đó là văn hóa xác định các quy tắc sắp xếp. Bạn có thể tìm thấy một nền văn hóa phù hợp với yêu cầu của bạn, hoặc xây dựng một văn hóa tùy chỉnh với các quy tắc so sánh cần thiết, nhưng nó có thể không phải là những gì bạn muốn.

Để có ví dụ tốt về chuẩn hóa chuỗi sao cho không có dấu trọng âm, have a look at this question. Sau khi chuẩn hóa chuỗi, bạn sẽ có thể so sánh chúng và xem xét chúng bằng nhau. Điều này có lẽ sẽ là cách dễ nhất để thực hiện yêu cầu của bạn.

Sửa

Nó không phải là chỉ là tôi nhân vật có hành vi này trong InvariantCulture, tuyên bố này cũng trả về false:

String.Equals("Ilê", "Ile", StringComparison.InvariantCultureIgnoreCase) 

Khung làm điều đúng - những nhân vật trong thực tế khác nhau (có ý nghĩa khác nhau) trong hầu hết các nền văn hóa, và do đó chúng không nên được coi là giống nhau.

+0

Chỉ cần thử điều đó, trả về +1. – Bryan

+0

Ngay cả khi điều đó có hiệu quả, nó cũng làm tôi ngạc nhiên khi vấn đề này đặc biệt đối với một nhân vật đó. – Bryan

+0

@Bryan: 'Î' là U + 00CE,' I' là U + 0049, chúng hoàn toàn khác nhau. – kennytm