为什么两个文字度数°符号在Windows下的单元测试中比较相等,但在Linux下不相等?

Why do two literal degree ° symbols compare equal in unit tests under Windows but not under Linux?

首先,让我说我了解字符编码以及为什么度数 (°) 符号在网页上可能会显示为问号。但是,我很困惑为什么代码中两次出现该文字字符似乎不相等,并且其中一个在单元测试中显示为问号,但仅当 运行ning 在 Linux 下时.

下面是生成度数符号的代码:

        public override string ToString()
        {
            var strLat = string.Format("{0} {1:D2}°{2:D2}'{3:D2}\"", IsNorth ? 'N' : 'S', Degrees, Minutes, Seconds);
            return strLat;
        }

所以它在我的代码中是一个文字字符。现在是单元测试。此测试在 Windows 下 运行 时通过,但在 Ubuntu Linux...

下我的 TeamCity 代理上 运行 时未通过
    [Subject(typeof(Declination), "Conversion to sexagesimal")]
    class when_converting_a_negative_double_declination_to_sexagesimal
    {
        Because of = () => Dec = new Declination(expectedValue);
        It should_format_correctly = () => Dec.ToString().ShouldEqual("S 06°13'01\"");
        It should_have_the_correct_value = () => Dec.Value.ShouldBeCloseTo(expectedValue);
        It should_have_positive_degrees = () => Dec.Degrees.ShouldBeGreaterThanOrEqualTo(0);
        It should_have_positive_minutes = () => Dec.Minutes.ShouldBeGreaterThanOrEqualTo(0);
        It should_have_positive_seconds = () => Dec.Seconds.ShouldBeGreaterThanOrEqualTo(0);
        static Declination Dec;
        const double expectedValue = -6.21712739926718;
    }

在我的单元测试中,它又作为一个文字字符出现了。你会认为这些比较相等(至少,我会)。但这是我在 TeamCity 中得到的结果:

这里显然存在一些 Unicode 欺诈行为,但老实说我看不出哪里有问题!从字面上看(双关语)两个字符串中的文字字符相同。为什么这个测试失败了?

文件必须使用不同的编码。

如果两个文件都包含文字 ° 个字符并且不匹配,则文件必须使用不同的编码 °

能否将文件转换为相同的编码。

或者,您可以使用 characters/strings ("\u00b0") 的 unicode 语法嵌入它们并保持在安全的 ASCII 范围内。