2017-09-25 42 views
17

Tôi có mã C# sau trong ứng dụng ASP.NET MVC của mình. Tôi cố gắng so sánh 2 string bằng phương pháp Equals, với culture = "vi". Mã của tôi dưới đây:String.Equals GID trả về false?

string culture = "vi"; 

System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo(culture); 
System.Threading.Thread.CurrentThread.CurrentUICulture = 
    System.Threading.Thread.CurrentThread.CurrentCulture; 

var CCC = string.Equals("CategId", "CATEGID", StringComparison.CurrentCultureIgnoreCase); 
var xx = string.Equals("TestGID", "TestGID", StringComparison.CurrentCultureIgnoreCase); 
var zz = string.Equals("id", "ID", StringComparison.CurrentCultureIgnoreCase); 

Kết quả:

CCC = sai;

xx = true;

zz = true;

Tôi không biết tại sao CCCfalse. Có gì sai không? Nếu tôi đặt culture = id, ko, en, v.v ... thì CCC = true. Ai có thể giúp tôi?

+0

Điều này ném một ngoại lệ: 'Văn hóa' vi 'là một nền văn hóa trung tính. Nó không thể được sử dụng trong định dạng và phân tích cú pháp và do đó không thể được đặt làm văn bản hiện tại của thread.' Bạn cần sử dụng 'vi-VN' (mặc dù vẫn sẽ trả về' false') –

+0

Đối với các ứng dụng không phải GUI, thay vào đó sử dụng 'StringComparer Comparer = StringComparer.Create (CultureInfo mới ("vi-VN"), đúng); Comparer.Equals ("CategId", "CATEGID"); 'Điều này là do văn hóa hiện tại chậm. – Ben

+0

Vì các chuỗi bạn so sánh là "rõ ràng" (đối với một số giá trị "rõ ràng") bằng tiếng Anh hoặc tiếng Anh, bạn nên, như Kevin gợi ý, sử dụng 'InvariantCultureIgnoreCase'. Chúng tôi đã gặp phải sự cố tương tự với "tên cài đặt" khi người nào đó sử dụng tiếng Thổ Nhĩ Kỳ đã kích hoạt vấn đề [chấm và không có chấm tôi] (https://en.wikipedia.org/wiki/Dotted_and_dotless_I), trong đó 'SID' không còn bằng' sid' thậm chí khi bỏ qua trường hợp. – TripeHound

Trả lời

25

Đó là gIkhông bằng GI trong trường hợp tiếng Việt. gi (GI) là âm tiết ban đầu, loại một chữ cái trong khi gIhai chữ cái riêng biệt. cặp khác là

cH != CH 
kH != KH 
nG != NG 
nH != NH 
pH != PH 
qU != QU 
tH != TH 
tR != TR 

https://en.wikipedia.org/wiki/Vietnamese_language

6

Bạn có thể thử

string culture = "vi"; 

System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo(culture); 

System.Threading.Thread.CurrentThread.CurrentUICulture = 
    System.Threading.Thread.CurrentThread.CurrentCulture; 

var CCC = string.Equals("CategId", "CATEGID", StringComparison.InvariantCultureIgnoreCase); 
var CCC1 = string.Equals("CategId", "CATEGID", StringComparison.CurrentCultureIgnoreCase); 

Trong CCC này sẽ trở lại true nhưng CCC1 sẽ trở lại falseVăn hóa. theo Văn hóa của bạn GIDgId thì khác.

Các vấn đề liên quan