为什么需要它:我有一个任务来处理Windows文件名,尤其是将它们用作键。当且仅当相应文件可以在Windows文件系统中共存时,它们的密钥才应该唯一。我可以将其转换为大写或小写。
This page说应该使用ToUpperInvariant()
代替ToLowerInvariant()
,因为:
一小部分字符转换为小写字母后就无法往返。
然后,this answer提供了可能出现此问题的“ ϱ”,“ς”,“ß”示例。
所以风险可能是其中之一:
a1
和a2
,它们在文件系统上会发生冲突。但是ToLowerInvariant()
保持不变,因此有所不同。A1
和A2
,它们将由ToLowerInvariant()
转换为相同的小写符号。它们不会在文件系统上发生冲突。然后假设ToUpperInvariant()
应该比ToLowerInvariant()
更好,因此会产生不同的结果,这是正确的。
我尝试了链接答案中的符号,To(Lower/Upper)Invariant()
实际上未触摸所有列出的内容,即使“ß”和“ẞ”都是独立的。我确实甚至可以创建2个文件,这些文件的区别仅在于那些符号,并且它们不会发生冲突。
所以,问题是:当ToLowerInvariant()
定义的等效性是错误的(与Windows文件系统不匹配)时,哪些是实际示例?
答案 0 :(得分:0)
不是您问题的真正答案,只是挑剔,太长了,无法置评。
一小部分字符转换为小写字母后就无法往返。
这在希腊文化中当然是有效的,但在使用不变文化时则不适用。在不变文化中,字母“ ϱ”,“ς”,“ß”根本不大写(请参见下面的示例)。
[TestMethod]
public void GreekRho_ToUpper_ToLower_InvariantCulture()
{
var original = "ϱ";
var upper = original.ToUpperInvariant();
var lower = upper.ToLowerInvariant();
Assert.AreEqual(original, lower);
}
[TestMethod]
public void GreekRho_ToUpper_ToLower_GreekCulture()
{
var greek = CultureInfo.CreateSpecificCulture("el-GR");
var original = "ϱ";
var upper = original.ToUpper(greek);
var lower = upper.ToLower(greek);
Assert.AreNotEqual(original, lower);
}