В C # в чем разница между ToUpper () и ToUpperInvariant ()?

В C #, в чем разница между ToUpper() и ToUpperInvariant() ?

Можете ли вы привести пример, где результаты могут быть разными?

ToUpper использует текущую культуру. ToUpperInvariant использует инвариантную культуру.

Канонический пример – Турция, где верхний регистр «i» не является «I».

Пример кода, показывающий разницу:

 using System; using System.Drawing; using System.Globalization; using System.Threading; using System.Windows.Forms; public class Test { [STAThread] static void Main() { string invariant = "iii".ToUpperInvariant(); CultureInfo turkey = new CultureInfo("tr-TR"); Thread.CurrentThread.CurrentCulture = turkey; string cultured = "iii".ToUpper(); Font bigFont = new Font("Arial", 40); Form f = new Form { Controls = { new Label { Text = invariant, Location = new Point(20, 20), Font = bigFont, AutoSize = true}, new Label { Text = cultured, Location = new Point(20, 100), Font = bigFont, AutoSize = true } } }; Application.Run(f); } } 

Более подробную информацию о турецком см. В этом блоге в блоге в Турции .

Я бы не удивился, услышав, что существуют различные другие проблемы с капитализацией, связанные с литыми персонажами и т. Д. Это всего лишь один пример, который я знаю из головы … отчасти потому, что он бил меня много лет назад на Java, где я был наверху -кабирование строки и сравнение ее с «MAIL». Это не так хорошо работает в Турции …

Ответ Джона прекрасен. Я просто хотел добавить, что ToUpperInvariant совпадает с вызовом ToUpper(CultureInfo.InvariantCulture) .

Это делает пример Джона немного проще:

 using System; using System.Drawing; using System.Globalization; using System.Threading; using System.Windows.Forms; public class Test { [STAThread] static void Main() { string invariant = "iii".ToUpper(CultureInfo.InvariantCulture); string cultured = "iii".ToUpper(new CultureInfo("tr-TR")); Application.Run(new Form { Font = new Font("Times New Roman", 40), Controls = { new Label { Text = invariant, Location = new Point(20, 20), AutoSize = true }, new Label { Text = cultured, Location = new Point(20, 100), AutoSize = true }, } }); } } 

Я также использовал New Times Roman, потому что это более холодный шрифт.

Я также установил свойство Font вместо двух элементов управления Label потому что свойство Font наследуется.

И я сократил несколько других строк только потому, что мне нравится компактный (например, не производственный) код.

В настоящий момент мне действительно нечего было делать.

Начать с MSDN

http://msdn.microsoft.com/en-us/library/system.string.toupperinvariant.aspx

Метод ToUpperInvariant эквивалентен ToUpper (CultureInfo.InvariantCulture)

Просто потому, что капитал «я» на английском языке, не всегда так делает.

String.ToUpper и String.ToLower могут давать разные результаты при разных культурах. Наиболее известным примером является пример Турции , для которого преобразование нижнего регистра «i» в верхний регистр не приводит к заглавному латинскому «I», но в турецком «я».

Капитализация I в зависимости от культуры, верхний ряд - строчные буквы, нижняя строка - буквы верхнего регистра

Что касается меня, это сбивало с толку даже с приведенным выше изображением ( источник ), я написал программу (см. Исходный код ниже), чтобы увидеть точный результат для турецкого примера:

 # Lowercase letters Character | UpperInvariant | UpperTurkish | LowerInvariant | LowerTurkish English i - i (\u0069) | I (\u0049) | I (\u0130) | i (\u0069) | i (\u0069) Turkish i - ı (\u0131) | ı (\u0131) | I (\u0049) | ı (\u0131) | ı (\u0131) # Uppercase letters Character | UpperInvariant | UpperTurkish | LowerInvariant | LowerTurkish English i - I (\u0049) | I (\u0049) | I (\u0049) | i (\u0069) | ı (\u0131) Turkish i - I (\u0130) | I (\u0130) | I (\u0130) | I (\u0130) | i (\u0069) 

Как вы видете:

  1. Верхние строчные буквы нижнего регистра и нижние строчные буквы верхнего регистра дают разные результаты для инвариантной культуры и турецкой культуры.
  2. Верхние буквы верхнего регистра и нижние строчные буквы нижнего регистра не имеют никакого эффекта, независимо от того, что такое культура.
  3. Culture.CultureInvariant оставляет турецких персонажей как
  4. ToLower и ToLower являются обратимыми, то есть ToLower символа после его верхнего уровня, приносит его в исходную форму, если для обеих операций используется одна и та же культура.

Согласно MSDN , для Char.ToUpper и Char.ToLower турецкие и азербайджанские являются единственными затронутыми культурами, потому что они единственные с односимвольными отличиями корпуса. Для строк может быть больше затронутых культур.


Исходный код консольного приложения, используемого для генерации вывода:

 using System; using System.Globalization; using System.Linq; using System.Text; namespace TurkishI { class Program { static void Main(string[] args) { var englishI = new UnicodeCharacter('\u0069', "English i"); var turkishI = new UnicodeCharacter('\u0131', "Turkish i"); Console.WriteLine("# Lowercase letters"); Console.WriteLine("Character | UpperInvariant | UpperTurkish | LowerInvariant | LowerTurkish"); WriteUpperToConsole(englishI); WriteLowerToConsole(turkishI); Console.WriteLine("\n# Uppercase letters"); var uppercaseEnglishI = new UnicodeCharacter('\u0049', "English i"); var uppercaseTurkishI = new UnicodeCharacter('\u0130', "Turkish i"); Console.WriteLine("Character | UpperInvariant | UpperTurkish | LowerInvariant | LowerTurkish"); WriteLowerToConsole(uppercaseEnglishI); WriteLowerToConsole(uppercaseTurkishI); Console.ReadKey(); } static void WriteUpperToConsole(UnicodeCharacter character) { Console.WriteLine("{0,-9} - {1,10} | {2,-14} | {3,-12} | {4,-14} | {5,-12}", character.Description, character, character.UpperInvariant, character.UpperTurkish, character.LowerInvariant, character.LowerTurkish ); } static void WriteLowerToConsole(UnicodeCharacter character) { Console.WriteLine("{0,-9} - {1,10} | {2,-14} | {3,-12} | {4,-14} | {5,-12}", character.Description, character, character.UpperInvariant, character.UpperTurkish, character.LowerInvariant, character.LowerTurkish ); } } class UnicodeCharacter { public static readonly CultureInfo TurkishCulture = new CultureInfo("tr-TR"); public char Character { get; } public string Description { get; } public UnicodeCharacter(char character) : this(character, string.Empty) { } public UnicodeCharacter(char character, string description) { if (description == null) { throw new ArgumentNullException(nameof(description)); } Character = character; Description = description; } public string EscapeSequence => ToUnicodeEscapeSequence(Character); public UnicodeCharacter LowerInvariant => new UnicodeCharacter(Char.ToLowerInvariant(Character)); public UnicodeCharacter UpperInvariant => new UnicodeCharacter(Char.ToUpperInvariant(Character)); public UnicodeCharacter LowerTurkish => new UnicodeCharacter(Char.ToLower(Character, TurkishCulture)); public UnicodeCharacter UpperTurkish => new UnicodeCharacter(Char.ToUpper(Character, TurkishCulture)); private static string ToUnicodeEscapeSequence(char character) { var bytes = Encoding.Unicode.GetBytes(new[] {character}); var prefix = bytes.Length == 4 ? @"\U" : @"\u"; var hex = BitConverter.ToString(bytes.Reverse().ToArray()).Replace("-", string.Empty); return $"{prefix}{hex}"; } public override string ToString() { return $"{Character} ({EscapeSequence})"; } } } 

http://msdn.microsoft.com/en-us/library/system.string.toupperinvariant.aspx

Документация Microsoft объясняет различия и дает примеры различных результатов.

ToUpperInvariant использует правила из инвариантной культуры

нет разницы в английском. только в турецкой культуре можно найти разницу.

  • Что случилось с C ++ wchar_t и wstrings? Каковы некоторые альтернативы широким персонажам?
  • Метод Ruby для удаления акцентов из международных символов UTF-8
  • Android: как получить текущий день недели (понедельник и т. Д.) На языке пользователя?
  • Чтение свойств пакета ресурсов в управляемом компоненте
  • Интернационализация в JSF, когда использовать набор сообщений и набор ресурсов?
  • Отображение валюты в индийском формате нумерации
  • hardcoded string "row three", следует использовать ресурс @string
  • Почему значения даты / времени неверно интерпретируются при исправлении / сохранении?
  • JavaFX 2 и интернационализация
  • Как интернационализировать веб-приложение Java?
  • Как получить локализованную строку шаблона даты?
  • Давайте будем гением компьютера.