ToUpperInvariant()和ToUpper(new CultureInfo("en-US", false))有什么区别?

6
我住在土耳其,需要在我的程序中将一个键大写。我不得不使用ToUpper(new CultureInfo("en-US", false))而不是ToUpper(),因为在设置为土耳其文化的计算机上,该函数的行为不同(请参见下面的图片)。然后我发现还有一种文化不变的大写函数:ToUpperInvariant()。
我搜索了但找不到这些函数之间的任何信息差异。它们之间有任何区别吗?

enter image description here enter image description here

source:http://www.moserware.com/2008/02/does-your-code-pass-turkey-test.html


我认为 ToUpperInvariant() 更接近于 ToUpper(CultureInfo.InvariantCulture) - juharr
1
“... if it is equal to en-US” - 官方上来说不一样,但实际上它们是无法区分的。我建议你应该使用不变版本。 - H H
@MatthewWatson - 那个土耳其i/1的东西是我最不想使用序数的领域。 - H H
我不进行比较,只是发送密钥,让我的同事在Java中比较这两个密钥。他在Java中使用了en-us版本,所以我使用了en-us而不是CultureInvariant,但实际上找不到像tr-tr这样行为不同的差异。 - onur demir
@HenkHolterman 也许是这样,但这正是微软在我链接的文章中建议您做的。您看过那篇文章吗? - Matthew Watson
显示剩余4条评论
1个回答

6

ToUpper()ToUpper(CultureInfo.CurrentCulture)是一样的,而ToUpperInvariant()ToUpper(CultureInfo.InvariantCulture)是一样的。评论中暗示你已经发现了这一点。

当然,这里存在差异-只有在不涉及人类交互(解析器等)时才应使用CultureInfo.InvariantCulture,因为它可以提供一致的结果,而ToUpper(CultureInfo.CurrentCulture)在计算机、服务器等之间大不相同。

CultureInfo.InvariantCulture是受英式文化启发的文化,类似于但不等于en-US,并且不绑定到任何国家或地区,用户也不能自定义它(正如所述的文档)。

至于明确回答关于ToUpper的问题-是的,存在差异。在下面所有情况(以下呈现),ToUpperInvariant()与小写源字符是相同的char

lc    en-US     Invariant
==    =====     =========

µ     Μ         µ
ı     I         ı
ſ     S         ſ
Dž     DŽ         Dž
Lj     LJ         Lj
Nj     NJ         Nj
Dz     DZ         Dz
ͅ      Ι         ͅ  //  ͅͅͅͅͅͅͅthis one lives in the 4th dimension. 
ς     Σ         ς
ϐ     Β         ϐ
ϑ     Θ         ϑ
ϕ     Φ         ϕ
ϖ     Π         ϖ
ϰ     Κ         ϰ
ϱ     Ρ         ϱ
ϵ     Ε         ϵ
ẛ     Ṡ         ẛ
ι     Ι         ι

是的,这是明确说明的。但 MM/dd/yy 格式已经表明了它的归属,这很难说是“与任何国家或地区无关”。 - H H
@HenkHolterman 是的,它共享了en-US中更不寻常的特点,这有点泄露了底细 :) - Jon Hanna
是的...但我不确定选择一个在任何默认文化中都不存在的格式是否是一个好主意。 - Tewr
1
ISO 8601格式或许更为明智,作为几乎每个国家的标准格式(即使是极少数传统格式)。 - Jon Hanna
那个标准只适用于日期。是否有一个日期格式,而其他的排序、大小写、数字等使用不同的格式会更合理呢?无论如何,现在已经太晚了,无法改变任何事情 :) - Tewr
显示剩余3条评论

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