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