string.ToLower() 和 string.ToLowerInvariant()

233
什么是它们之间的区别?何时使用ToLower()和何时使用ToLowerInvariant()会有什么风险?

4
或许你应该将字符串规范化为大写形式。请参阅 https://msdn.microsoft.com/zh-cn/library/bb386042.aspx。 - habakuk
请参见 https://dev59.com/nnA65IYBdhLWcg3w8zft - riQQ
4个回答

211

根据当前的文化环境,ToLower 可能会产生一些文化特定的小写字母,这可能会导致你出乎意料的结果,例如生成没有点的 "ı" 而不是 "i",从而破坏字符串比较。因此,在任何非语言特定数据的情况下,都应该使用 ToLowerInvariant。只有在你可能有用户输入并且他们的本地语言/字符集可能不同时,才需要使用 ToLower。

参见这个问题以了解此问题的示例:C#- ToLower() is sometimes removing dot from the letter "I"


79

TL;DR:

当处理“内容”(如文章、帖子、评论、名称、地点等)时,请使用ToLower()。当处理“文字”(如命令行参数、自定义语法、应该是枚举的字符串等)时,请使用ToLowerInvariant()

示例:

=不正确地使用 ToLowerInvariant=

在土耳其语中,“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上面的点,几乎看不见)。 这可能会让你的土耳其用户感到非常沮丧。


4
我是一名多年的专业开发人员,以前我知道这个问题被称为“土耳其语中的'I'问题”。然而,这是迄今为止我读过的最好、最简短的解释。谢谢! - Peit
非常好的解释,即使对于像我这样的土耳其人来说也很好理解 :) 对于好奇的人来说,可以在你的代码通过了土耳其测试吗?找到更多信息。 - undefined

48

我认为这可能很有用:

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

希望对您有所帮助


@danyolgiax 请您能否进一步阐述?从 MSDN 的链接中无法推断其可用性。谢谢。 - Prerak K
2
ToLowerInvariant 在土耳其的表现不如预期。İ 变成了 ı。 - Furkan Gözükara

30

1
不,他不是。"Ordinal"是第三个选项——一种稍微不同的方式来“忽略”当前文化。在讨论 ToLower 变体时,这种区别并不相关;Ordinal vs. invariant 只会改变两个字符串的“排序顺序”,而不会改变相等比较。 - ToolmakerSteve

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接