2015-06-11 2 views
0

Я просто ищу любой пример, что эти два метода дают разные результаты. Прежде всего, я посещаю msdn page и запустить код из него с незначительными изменениямиToLower vs ToLowerInvariant

using System; 
using System.Globalization; 
using System.Linq; 

class Program 
{ 
    static void Main() 
    { 
     string[] words = { "Tuesday", "Salı", "Вторник", "Mardi", 
         "Τρίτη", "Martes", "יום שלישי", 
         "الثلاثاء", "วันอังคาร" }; 
     Console.BufferHeight = 1000; 
     var test = CultureInfo.GetCultures(CultureTypes.AllCultures) 
           .Select(ci => 
             { 
              string[] wordsToLower = words.Select(x => x.ToLower(ci)).ToArray(); 
              string[] wordsToLowerInvariant = words.Select(x => x.ToLowerInvariant()).ToArray(); 
              return new 
               { 
                Culture = ci, 
                ToLowerDiffers = !wordsToLower.SequenceEqual(wordsToLowerInvariant) 
               }; 
             }) 
           .ToArray(); 
     foreach (var x in test) 
     { 
      Console.WriteLine("Culture {0}, ToLower and ToLowerInvariant produces different results: {1}", x.Culture, x.ToLowerDiffers); 
     } 
     Console.WriteLine(); 
     Console.WriteLine("Difference exists for any ToLower call: {0}", test.Any(x => x.ToLowerDiffers)); 
    } 
} 

Но здесь у меня есть проблема: этот код выдает тот же результат для ToLower и ToLowerInvariant вызовов во всех существующих культурах.

Вопрос: есть ли какая-либо строка, которая дает разные результаты для этого теста?

+1

Вы видели [этот другой вопрос] (http://stackoverflow.com/q/16797597/50447) или [этот ответ] (http://stackoverflow.com/a/26895380/50447)? –

+0

«Турецкая проблема» http://blog.codinghorror.com/whats-wrong-with-turkey/ –

+0

Еще один приятный читать http://www.moserware.com/2008/02/does-your-code-pass- turkey-test.html – Dolgsthrasir

ответ

5

Попробуйте Турецкий пунктир İ:

var culture = new CultureInfo("tr-TR"); 

string test = "İ"; 

if (test.ToLower(culture) == test.ToLowerInvariant()) 
    Console.WriteLine("Same"); 
else 
    Console.WriteLine("Different"); // Prints this! 
+0

Более конкретно, нормальный ASCII 'i' заглатывает большую точную «İ», если культура пользователя - турецкая. Если вы не хотите этого поведения, избегайте его, указав другую культуру, такую ​​как инвариантная. – user1676558

1

xxxInvariant предполагает установку культуры по умолчанию. Чтобы показать разницу, вы должны продемонстрировать ToLower и ToLowerInvariant с информацией о культуре, которая отличается от культуры по умолчанию в вашей настройке. И по умолчанию культура по умолчанию - это культура системы.

Итак, если культура вашей системы является en-US, и вы используете в своем коде только символы en-US, ToLower и ToLowerInvariant дадут тот же результат.

Насколько я могу судить, если вы измените «Salı» на «SALI» после ToLowerInvariant, вы должны получить «Sali».

+0

Он вызывает переопределение 'ToLower()', которое принимает 'CultureInfo' –

+0

Возможно, вы ошибаетесь? String.ToLower() использует культуру по умолчанию, а String.ToLowerInvariant() использует инвариантную культуру. Поэтому вы, по сути, задаете разницу между инвариантной культурой и сравнением порядковых строк. http://stackoverflow.com/a/6225872/742084 – Cel

Смежные вопросы