繁体   English   中英

Culture-Invariant区分大小写的字符串比较会在不同的计算机上返回不同的结果

[英]Culture-Invariant case-sensitive string comparison returns different results on different machines

我发现我的机器和构建服务器上的测试结果不同。 我设法找到了不同的单行。 这是一个字符串比较。 在第一个字符的情况下,两个字符串不同。

下面的测试在我的本地机器上传递,在构建机器上失败。

[TestClass]
public class Tests 
{
    [TestMethod]
    public void Strings()
    {
        Assert.IsFalse(0 == string.Compare("Term’s", "term’s", false, CultureInfo.InvariantCulture));
    }
}

我也尝试将其更改为string.Equals

string.Equals("Term’s", "term’s", StringComparison.InvariantCulture);

string.Equals在构建服务器上返回true,并在本地计算机上返回false。

顺序比较在两台机器上给出相同的结果:

string.Compare("Term’s", "term’s", StringComparison.Ordinal))

据我了解,InvariantCulture应该在各地返回相同的结果。 区分大小写的文化不变字符串比较如何依赖于机器? 我应该检查哪些设置来识别问题?

更新:平台和字符串

字符串很重要。 对于具有“异国情调”标点符号的字符串,例如右单引号右双引号,可以观察到这些结果

似乎该行为在Windows 8计算机上重现。 如果您键入以下内容,甚至可以在https://dotnetfiddle.net/上看到它:

using System;
using System.Globalization;

public class Program
{
    public static void Main()
    {
        Console.WriteLine(0 == string.Compare("Terms", "terms", false, CultureInfo.InvariantCulture));
        Console.WriteLine(0 == string.Compare("Term’s", "term’s", false, CultureInfo.InvariantCulture));
        Console.WriteLine(0 == string.Compare("Term“s", "term“s", false, CultureInfo.InvariantCulture));
        Console.WriteLine(0 == string.Compare("Term”s", "term”s", false, CultureInfo.InvariantCulture));

        //outputs
        //False
        //True
        //True
        //True
    }
}

Environment.OSVersion (服务器):Microsoft Windows NT 6.2.9200.0
Environment.Is64BitOperatingSystem (server's):是的
Environment.Version (服务器的)4.0.30319.18449

Environment.OSVersion (本地):Microsoft Windows NT 6.1.7601 Service Pack 1
Environment.Is64BitOperatingSystem (local):True
Environment.Version (local):4.0.30319.18444

更新:相关的MSDN论坛链接

它可能是Windows 8中的已知错误,已在Windows 8.1中修复。

http://social.msdn.microsoft.com/Forums/vstudio/en-US/4a1ab6b7-6dcc-46bf-8650-e0d9ebbf1735/stringcompare-not-always-casesensitive-on-windows-8?forum=netfxbcl

遗憾的是,InvariantCulture仍然是一种语言比较,因此它可以在操作系统版本之间变化(并且确实有所不同,特别是在新的字符添加到Unicode时)。 4.0之前的.Net版本带有他们自己的数据有效载荷,因此不会改变,但从那时起他们从操作系统中获取数据并且可能会有所不同。 Ordinal是唯一不会改变的比较,如果你想要稳定,你真正需要做的事情。

也就是说,您不应该看到您提供的代码的行为差异。 您观察到的差异是由Windows 8中已修复的Windows 8中的错误引起的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM