string.ToLower () та string.ToLowerInvariant ()


163

У чому різниця і коли використовувати що? Який ризик, якщо я завжди використовую, ToLower()і який ризик, якщо я завжди використовую ToLowerInvariant()?


4
Можливо, вам слід замість цього нормалізувати рядки у верхній регістр. Дивіться msdn.microsoft.com/en-us/library/bb386042.aspx
habakuk

Відповіді:


148

Залежно від нинішньої культури, ToLower може створити маленьку літеру, специфічну для культури, якої ви не очікуєте. Наприклад, створення ınfoбез крапки на i замість цього, infoа також вимикання порівнянь рядків. З цієї причини ToLowerInvariant слід використовувати для будь-яких даних, що не належать до мови. Якщо у вас можуть бути введені користувачем дані, які можуть бути на рідній мові / наборі символів, зазвичай це єдиний раз, коли ви використовуєте ToLower.

Дивіться це питання на прикладі цього питання: C # - ToLower () іноді видаляє крапку з літери "Я"


45

Я думаю, що це може бути корисно:

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

оновлення

Якщо ваш додаток залежить від випадку зміни рядка передбачуваним способом, який не впливає на поточну культуру, використовуйте метод ToLowerInvariant. Метод ToLowerInvariant еквівалентний ToLower (CultureInfo.InvariantCulture). Метод рекомендується, коли колекція рядків повинна з'являтися в передбачуваному порядку в елементі управління користувальницьким інтерфейсом.

також

... ToLower дуже схожий у більшості місць на ToLowerInvariant. Документи вказують, що ці методи змінить поведінку лише з турецькими культурами. Крім того, у системах Windows файлова система нечутлива до регістру, що ще більше обмежує її використання ...

http://www.dotnetperls.com/tolowerinvariant-toupperinvariant

hth


@danyolgiax Будь ласка, можете детальніше розробитись? не можу зробити висновок про його зручність за посиланням msdn. Спасибі
Prerak K

2
так, ToLowerInvariant не працює турецькою, як очікувалося. İ стає ı
MonsterMMORPG

28

String.ToLower()використовує культуру за замовчуванням, тоді як String.ToLowerInvariant()використовує інваріантну культуру. Отже, ви по суті запитуєте відмінності між інваріантною культурою та порівнянням порядкових рядків .


Ні, він не є. "Звичайний" - третій варіант - дещо інший спосіб "ігнорувати" сучасну культуру. Відмінність не є актуальною при обговоренні ToLowerваріантів; Ординальний проти інваріант просто змінює "порядок сортування" двох рядків, не змінює порівняння рівності.
ToolmakerSteve

27

TL; DR:

Під час роботи зі «вмістом» (наприклад, статтями, публікаціями, коментарями, іменами, місцями тощо) використовуйте ToLower(). Під час роботи з "літералами" (наприклад, аргументи командного рядка, користувацькі граматики, рядки, які мають бути перерахунками тощо) ToLowerInvariant().

Приклади:

= Неправильне використанняToLowerInvariant =

Турецькою DIŞозначає «зовні» і dişозначає «зуб». Правильний нижній кожух DIŞє dış. Отже, якщо ви ToLowerInvariantнеправильно вживаєте, у вас може виникнути помилки в Туреччині.

= Неправильне використанняToLower =

Тепер зробіть вигляд, що ви пишете SQL-аналізатор. Десь у вас з’явиться код, який виглядає так:

if(operator.ToLower() == "like")
{
  // Handle an SQL LIKE operator
}

Граматика SQL не змінюється при зміні культур. Француз не пише SÉLECTIONNEZ x DE booksзамість SELECT X FROM books. Однак для того, щоб вищезазначений код працював, турецькій людині потрібно було б написати SELECT x FROM books WHERE Author LİKE '%Adams%'(зверніть увагу на крапку над столицею i, майже неможливо побачити). Це було б дуже неприємно для вашого турецького користувача.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.