代码之家  ›  专栏  ›  技术社区  ›  max630

Tolowerinvariant错误时的实际示例

  •  2
  • max630  · 技术社区  · 6 年前

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

    This page ToUpperInvariant() 应该使用而不是 ToLowerInvariant() ,因为:

    一小群字符转换成小写时,不能往返。

    然后, this answer 提供了可能存在此问题的“+”、“”和“”的示例。

    所以风险在于:

    • 有两个符号 a1 a2 ,这将在文件系统上发生冲突。但是 ToLowerinVariant() 保持不变,因此不同。
    • 有两个符号 A1 A2 ,它将通过 ToLowerinVariant() 同一个小写符号。它们不会在文件系统上发生冲突。
    • 我还有什么遗漏吗?

    然后假设 图珀不变量() 应该比 ToLowerinVariant() ,则会产生不同的结果,这是正确的。

    我试过链接答案中的符号,实际上 所有列出的都不触碰 通过 To(Lower/Upper)Invariant() ,甚至“”和“啊”都是独立的。我甚至可以创建两个只与这些符号不同的文件,它们不会冲突。

    所以,问题是 :当等效定义为 ToLowerinVariant() 错误(与Windows文件系统不匹配)?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Jakub Å turc    5 年前

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

    一小群字符转换成小写时,不能往返。

    这在希腊文化中当然是有效的,但在使用不变文化时不适用。在不变的区域性字母中,“+”、“,”根本不大写(参见下面的示例)。

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