【问题标题】:C# String comparisons: Difference between CurrentCultureIgnoreCase and InvariantCultureIgnoreCaseC# 字符串比较:CurrentCultureIgnoreCase 和 InvariantCultureIgnoreCase 之间的区别
【发布时间】:2009-01-06 20:19:02
【问题描述】:

在C#中做字符串比较时,和做比较有什么区别

string test = "testvalue";
test.Equals("TESTVALUE", StringComparison.CurrentCultureIgnoreCase);

string test = "testvalue";
test.Equals("TESTVALUE", StringComparison.InvariantCultureIgnoreCase);

...无论如何,包含那个额外的参数很重要吗?

【问题讨论】:

    标签: c# string comparison


    【解决方案1】:

    其他帖子提供了很好的建议,但我认为最好举一个例子来说明它确实会有所作为:

    using System;
    using System.Globalization;
    using System.Threading;
    
    class Test
    {
        static void Main()
        {
            CultureInfo turkish = CultureInfo.CreateSpecificCulture("tr");
            Thread.CurrentThread.CurrentCulture = turkish;                
    
            // In Turkey, "i" does odd things
            string lower = "i";
            string upper = "I";
            
            // Prints False
            Console.WriteLine(lower.Equals(upper, 
                StringComparison.CurrentCultureIgnoreCase));
            // Prints True
            Console.WriteLine(lower.Equals(upper, 
                StringComparison.InvariantCultureIgnoreCase));
        }
    }
    

    (毫无疑问还有很多其他案例——这只是我想到的第一个。)

    【讨论】:

    • 是的,土耳其语 i 是一个特例。它们有一个带有大写“I”的小写无点“ı”和一个带有大写“İ”的小写“i”。它被认为是文化差异的典型案例。
    • 有关土耳其语作为配置器提到的“规范案例”的更多信息,请参阅:moserware.com/2008/02/does-your-code-pass-turkey-test.html
    • 我在越南语String.Compare("logid", "logId", StringComparison.CurrentCultureIgnoreCase) == 1 中遇到了同样的事情。但是String.Compare("id", "Id", StringComparison.CurrentCultureIgnoreCase) == 0 :O
    • @JonSkeet 稍微改进此答案的一个建议是将您的代码输出包含在答案中(即False,然后是True)。
    • @LeopardSkinPillBoxHat:完成。
    【解决方案2】:

    Microsoft 就何时使用 InvariantCulture 属性提供了一些不错的指导:

    MSDN: CultureInfo.InvariantCulture Property

    ...应用程序应该使用 仅用于进程的不变文化 需要独立于文化的 结果,例如格式化和 解析持久化到 文件。在其他情况下,它会产生 可能在语言上的结果 不正确或在文化上不恰当。

    安全注意事项

    如果将做出安全决定 基于字符串的结果 比较或案例更改,您的 应用程序应使用序数 忽略大小写的比较 使用 InvariantCulture。 [...]

    字符串操作

    如果您的应用程序需要执行 文化敏感的字符串操作 不受价值的影响 CurrentCulture,它应该使用一个方法 接受 CultureInfo 参数。 [...]

    持久化数据

    InvariantCulture 属性是 用于存储不会 直接展示给用户。 以独立于文化的方式存储数据 格式保证一个已知的格式, 不改变。当用户从 不同的文化访问数据,它 可以适当地格式化 在特定用户上。 [...]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      • 2017-01-29
      相关资源
      最近更新 更多