string.ToLower()およびstring.ToLowerInvariant()


回答:


148

現在のカルチャに応じて、ToLowerは、予期しないカルチャ固有の小文字を生成する場合があります。ınfo代わりに、iにドットなしで生成して、info文字列比較を汚すなど。そのため、言語固有でないデータではToLowerInvariantを使用する必要があります。ユーザーの母国語/文字セットである可能性のあるユーザー入力がある場合、通常はToLowerを使用する唯一の時間です。

この問題の例については、この質問を参照してください 。C#-ToLower()が文字「I」からドットを削除することがあります


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のリンクからその使用可能性を推測できません。ありがとう
Prera​​k K 2013

2
はいToLowerInvariantが期待どおりにトルコ語で機能していません。İはıになります
MonsterMMORPG

28

String.ToLower()デフォルトのカルチャをString.ToLowerInvariant()使用し、インバリアントカルチャを使用します。したがって、本質的には、不変カルチャと順序文字列比較の違いを尋ねています


いいえ、そうではありません。「序数」は3番目のオプションです-現在の文化を「無視」するための少し異なる方法。この違いは、ToLowerバリアントの議論には関係ありません。序数と不変量は、2つの文字列の「ソート順」を変更するだけで、等価比較は変更しません。
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の上にあるドットは、ほとんど見えません)。これはトルコのユーザーにとって非常にイライラするでしょう。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.