关于C #:string.ToLower()和string.ToLowerInvariant()

string.ToLower() and string.ToLowerInvariant()

有什么区别,什么时候用什么?如果我总是使用tolower()有什么风险?如果我总是使用tolowerinvariant()有什么风险?


根据当前的区域性,Tolower可能会生成一个您不期望的特定于区域性的小写字母。例如在i上不带点而不是info生成?nfo,从而破坏字符串比较。因此,tolowerinvariant应该用于任何非语言特定的数据。当您可能有可能是他们的母语/字符集的用户输入时,通常是您使用tolower的唯一时间。

有关此问题的示例,请参见此问题:c-tolower()有时会从字母"i"中删除点。


我认为这是有用的:

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

更新

If your application depends on the case of a string changing in a predictable way that is unaffected by the current culture, use the ToLowerInvariant method. The ToLowerInvariant method is equivalent to ToLower(CultureInfo.InvariantCulture). The method is recommended when a collection of strings must appear in a predictable order in a user interface control.

...ToLower is very similar in most places to ToLowerInvariant. The documents indicate that these methods will only change behavior with Turkish cultures. Also, on Windows systems, the file system is case-insensitive, which further limits its use...

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

高温高压


String.ToLower()使用默认的区域性,而String.ToLowerInvariant()使用不变的区域性。因此,您实际上是在询问不变区域性和序数字符串比较之间的区别。


DR:

使用"内容"(例如文章、帖子、评论、姓名、地点等)时,请使用ToLower()。使用"文本"(例如命令行参数、自定义语法、应为枚举的字符串等)时,请使用ToLowerInvariant()

实例:

=错误使用ToLowerInvariant。=

在土耳其语中,DI?表示"外部",DI?表示"牙齿"。DI?的下壳体为d??。因此,如果您使用ToLowerInvariant不正确,您可能在土耳其有打字错误。

=错误使用EDOCX1[12]=

现在假设您正在编写一个SQL解析器。在某个地方,您将得到如下代码:

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

当您更改区域性时,SQL语法不会更改。法国人不写"EDOCX1"(13),而写"EDOCX1"(14)。然而,为了使上述代码生效,土耳其人需要编写SELECT x FROM books WHERE Author L?KE '%Adams%'(注意大写字母I上方的点,几乎看不到)。这对您的土耳其用户来说是非常令人沮丧的。