2013-02-20 40 views
5

Chúng tôi có hai chữ cái 'ی' và 'ي', chữ cái đầu tiên là chữ cái chính sau cửa sổ bảy.
Quay lại XP cũ, chúng tôi có phiên bản thứ hai là chính.
Bây giờ các yếu tố đầu vào tôi nhận được được xác định là khác nhau nếu một khách hàng ở trên Windows XP và cửa sổ kia trên cửa sổ bảy.
Tôi cũng đã cố gắng sử dụng văn hóa Ba Tư không thành công.
Tôi có thiếu gì không?
EDIT: Đã phải thay đổi các từ để hiểu rõ hơn .. bây giờ chúng trông giống nhau.Tại sao so sánh hai từ bằng nhau không trả về 0?

foreach (CompareOptions i in Enum.GetValues(new CompareOptions().GetType()).OfType<CompareOptions>()) 
    Console.WriteLine(string.Compare("محسنين", "محسنین", new CultureInfo("fa-ir"), i) + "\t : " + i); 

Đầu ra:

-1  : None 
-1  : IgnoreCase 
-1  : IgnoreNonSpace 
-1  : IgnoreSymbols 
-1  : IgnoreKanaType 
-1  : IgnoreWidth 
1  : OrdinalIgnoreCase 
-1  : StringSort 
130  : Ordinal 
+2

Vâng điều đó dường như không công bằng chút nào. –

+5

Tôi không phải là người Ba Tư và không thực sự hiểu ngôn ngữ, nhưng: ي không giống như ی với tôi! –

+1

@Aniket Cũng giống như một không giống như A .. nhưng cả hai đều bằng nhau –

Trả lời

5

Hai chuỗi là không bình đẳng. Chữ cái cuối cùng khác nhau.

Về lý do tại sao IgnoreCase lợi nhuận -1 nhưng OrdinalIgnoreCase lợi nhuận 1:

  • OrdinalIgnoreCase sử dụng văn hóa bất biến để chuyển đổi chuỗi thành chữ hoa và sau đó thực hiện một byte bằng cách so sánh byte
  • IgnoreCase sử dụng văn hóa theo quy định để thực hiện so sánh không phân biệt chữ hoa chữ thường.

Sự khác biệt là IgnoreCase biết "thêm" về sự khác biệt trong các chữ cái của ngôn ngữ được chỉ định và sẽ đối xử với chúng khác với văn bản bất biến, dẫn đến kết quả khác.
Đây là một biểu hiện khác của những gì được gọi là "The Turkish İ Problem".

Bạn có thể xác minh điều đó cho mình bằng cách sử dụng các InvariantCulture thay vì Ba Tư một:

foreach (CompareOptions i in Enum.GetValues(new CompareOptions().GetType()).OfType<CompareOptions>()) 
    Console.WriteLine(string.Compare("محسنی", "محسني", CultureInfo.InvariantCulture, i) + "\t : " + i); 

chí này ra 1 cho cả IgnoreCaseOrdinalIgnoreCase.

Về câu hỏi đã chỉnh sửa của bạn:
Hai chuỗi vẫn khác nhau. Đoạn mã sau xuất ra các giá trị của các ký tự đơn trong chuỗi.

foreach(var value in strings.Select(x => x.ToCharArray().Select(y => (int)y))) 
    Console.WriteLine(value); 

Kết quả sẽ giống như thế này:

1605 
1581 
1587 
1606 
1610 // <-- "yeh": ي 
1606 

1605 
1581 
1587 
1606 
1740 // <-- "farsi yeh": ی 
1606 

Như bạn thấy, có một nhân vật mà khác, kết quả là một sự so sánh mà đối xử với những người hai chuỗi là không bình đẳng.

+0

Tôi đã cập nhật câu trả lời của tôi .. bây giờ những gì? –

+0

@Mahdi: Chúng vẫn khác nhau. Và sự khác biệt này rất có thể là lý do thực sự cho kết quả bạn đã trải qua tất cả cùng. Chuỗi đầu tiên chứa các ký tự với các giá trị sau: 1605, 1581, 1587, 1606, ** 1610 **, 1606. Chuỗi thứ hai chứa các giá trị sau: 1605, 1581, 1587, 1606, ** 1740 **, 1606. Như bạn có thể thấy, một byte khác nhau. –

+0

@DanielHilgarth Tôi chỉ không quan tâm đến các byte khác nhau .. Tất cả tôi biết cả hai từ đều giống nhau ở Ba Tư. Nếu bạn nói đúng thì Microsoft đã sai khi thay đổi trong các nền tảng Windows khác nhau. Thật đơn giản. Bạn hoặc so sánh .NET hoặc chiến lược của Microsoft là sai. –

0

đây Nhân vật của tôi Mã Ả Rập “ي, ك” để Ba Tư “ی, ک”, Bằng phương pháp khuyến nông:

private static readonly string[] pn = { "ی", "ک" }; 
    private static readonly string[] ar = { "ي", "ك" }; 
    public static string ToFaText(this string strTxt) 
    { 
     string chash = strTxt; 
     for (int i = 0; i < 2; i++) 
      chash = chash.Replace(ar[i],pn[i]); 
     return chash; 
    } 
Các vấn đề liên quan