string.ToLower()和string.ToLowerInvariant()


Answers:


148

根据当前的文化,ToLower可能会生成您所期望的文化特定的小写字母。例如,ınfo在i上生成点而不是点info,从而破坏了字符串比较。因此,应在任何非语言特定的数据上使用ToLowerInvariant。当用户输入的输入可能使用其母语/字符集时,通常是唯一使用ToLower的时间。

有关此问题的示例,请参见此问题: C#-ToLower()有时会从字母“ I”中删除点


45

我认为这可能很有用:

http://msdn.microsoft.com/zh-CN/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

2
是的ToLowerInvariant在土耳其语中无法正常工作。I变为ı
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上方的圆点,几乎看不到)。对于您的土耳其用户而言,这将是非常令人沮丧的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.