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

.net 为什么两个字度°;在Windows下的单元测试中符号比较相等,但在Linux下不相等?,.net,.net-core,unicode,character-encoding,cross-platform,.net,.net Core,Unicode,Character Encoding,Cross Platform,首先,让我说,我理解字符编码,以及为什么学位(°)符号可能在网页上显示为问号。然而,我感到困惑的是,为什么代码中出现的两个文字字符似乎不相等,而其中一个在单元测试中显示为问号,但只有在Linux下运行时才显示 以下是生成学位符号的代码: public override string ToString() { var strLat = string.Format("{0} {1:D2}°{2:D2}'{3:D2}\"&qu

首先,让我说,我理解字符编码,以及为什么学位(°)符号可能在网页上显示为问号。然而,我感到困惑的是,为什么代码中出现的两个文字字符似乎不相等,而其中一个在单元测试中显示为问号,但只有在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骗局,但我真的不知道在哪里!两个字符串中的字面(双关语)是相同的文字字符。为什么此测试失败?

文件必须使用不同的编码

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

你能把这些文件转换成相同的编码吗


或者,您可以使用unicode语法为字符/字符串(
“\u00b0”
)嵌入它们,并保持在安全的ASCII范围内。

这两个源文件的文件编码是什么?它们是一样的吗?@omajid我想是的,我真的不知道你能改变这一点。我使用Visual Studio。@omajid啊哈!看来你有什么发现了。看起来一个文件是Windows-1252,另一个是UTF-8。我用VS代码打开了它们,它在状态栏中显示了编码。只是为了展示,一个人不应该假设@奥马吉德就是这样。我的一些文件使用Windows-1252编码,一些文件使用UTF-8。我用UTF-8重写了它们,其中一个学位符号在源代码中变成了问号。然后我纠正了这一点,现在所有的测试都在Windows和Linux上通过了。你想把它写下来作为答案,这样我就可以把它标记为解决方案了吗?