В C #, в чем разница между ToUpper()
и ToUpperInvariant()
?
Можете ли вы привести пример, где результаты могут отличаться?
c#
internationalization
Лил Лэнси
источник
источник
Ответы:
ToUpper
использует текущую культуру.ToUpperInvariant
использует инвариантную культуру.Каноническим примером является Турция, где верхний регистр «я» не «я».
Пример кода, показывающий разницу:
Для получения дополнительной информации о турецком языке см. Этот пост в блоге по тестированию Турции .
Я не удивлюсь, узнав, что существуют различные другие проблемы с заглавными буквами, связанные с элитированными персонажами и т. Д. Это только один пример, который я знаю из головы ... отчасти потому, что он укусил меня много лет назад в Java, где я был выше -составить строку и сравнить ее с "MAIL". Это не сработало так хорошо в Турции ...
источник
ımage
в качестве имени поля дляImage
Unity 3D спам и внутреннюю ошибку консолиUnable to find key name that matches 'rıght'
в «английской» Windows с региональными настройками Турции для даты и времени. Похоже, иногда даже Microsoft не проходит тест на Турцию, язык ПК даже не турецкий, просто смеется.Ответ Джона идеален. Я просто хотел добавить, что
ToUpperInvariant
это то же самое, что звонитьToUpper(CultureInfo.InvariantCulture)
.Это делает пример Джона немного проще:
Я также использовал New Times Roman, потому что это более прохладный шрифт.
Я также установил свойство
Form
'sFont
вместо двухLabel
элементов управления, потому чтоFont
свойство наследуется.И я сократил несколько других строк только потому, что мне нравится компактный (например, не производственный) код.
У меня действительно не было ничего лучшего, чтобы сделать в данный момент.
источник
Начать с MSDN
http://msdn.microsoft.com/en-us/library/system.string.toupperinvariant.aspx
Просто потому, что капитал я есть «Я» на английском языке, не всегда делаю это так.
источник
String.ToUpper
иString.ToLower
может давать разные результаты для разных культур. Самым известным примером является турецкий пример , в котором преобразование строчной латинской «i» в прописную приводит не к заглавной латинской «I», а к турецкой «I».Что касается меня, это сбивало с толку даже изображение выше ( исходный код ), я написал программу (см. Исходный код ниже), чтобы увидеть точный результат для турецкого примера:
Как вы видете:
Culture.CultureInvariant
оставляет турецкие символы как естьToUpper
иToLower
являются обратимыми, то есть нижний регистр символа после верхнего регистра приводит его к исходной форме, если для обеих операций использовалась одна и та же культура.Согласно MSDN , для Char.ToUpper и Char.ToLower турецкий и азербайджанский являются единственными затронутыми культурами, потому что они единственные с односимвольными различиями в регистре. Для строк могут быть затронуты другие культуры.
Исходный код консольного приложения, используемого для генерации вывода:
источник
ToUpperInvariant использует правила из инвариантной культуры
источник
в английском нет разницы. только в турецкой культуре можно найти разницу.
источник