首页 > 解决方案 > ToLowerInvariant 错误时的实际示例

问题描述

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

该页面ToUpperInvariant()应该使用 代替ToLowerInvariant(),因为:

一小部分字符在转换为小写时不能往返。

然后,此答案提供了可能存在此问题的“ϱ”、“ς”、“ß”的示例。

因此,风险将是其中之一:

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

我已经尝试了链接答案中的符号,实际上所有列出的符号都没有被 触及To(Lower/Upper)Invariant()甚至“ß”和“ẞ”都是独立的。我什至可以创建 2 个仅在这些符号上有所不同的文件,并且它们不会发生冲突。

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

标签: .netwindowsunicode

解决方案


不是你的问题的真正答案,只是小吹毛求疵,太长了,无法发表评论。

一小部分字符在转换为小写时不能往返。

这在希腊文化中当然是有效的,但是当你使用不变的文化时它并不适用。在不变的文化中,字母“ϱ”、“ς”、“ß”根本不大写(参见下面的示例)。

    [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);
    }

推荐阅读