ToLowerInvariant错误的实际示例

时间:2018-12-11 06:48:16

标签: .net windows unicode

为什么需要它:我有一个任务来处理Windows文件名,尤其是将它们用作键。当且仅当相应文件可以在Windows文件系统中共存时,它们的密钥才应该唯一。我可以将其转换为大写或小写。

This page说应该使用ToUpperInvariant()代替ToLowerInvariant(),因为:

  

一小部分字符转换为小写字母后就无法往返。

然后,this answer提供了可能出现此问题的“ ϱ”,“ς”,“ß”示例。

所以风险可能是其中之一:

  • 有两个符号a1a2,它们在文件系统上会发生冲突。但是ToLowerInvariant()保持不变,因此有所不同。
  • 有2个符号A1A2,它们将由ToLowerInvariant()转换为相同的小写符号。它们不会在文件系统上发生冲突。
  • 我想念的还有什么吗?

然后假设ToUpperInvariant()应该比ToLowerInvariant()更好,因此会产生不同的结果,这是正确的。

我尝试了链接答案中的符号,To(Lower/Upper)Invariant()实际上未触摸所有列出的内容,即使“ß”和“ẞ”都是独立的。我确实甚至可以创建2个文件,这些文件的区别仅在于那些符号,并且它们不会发生冲突。

所以,问题是:当ToLowerInvariant()定义的等效性是错误的(与Windows文件系统不匹配)时,哪些是实际示例?

1 个答案:

答案 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);
    }