为什么 Assert.AreEqual() 对字符串和 DateTimeFormatter 失败?

Why does Assert.AreEqual() fail for string and DateTimeFormatter?

我编写了以下单元测试来测试日期时间格式:

using System;
using Windows.Globalization.DateTimeFormatting;
using Microsoft.VisualStudio.TestPlatform.UnitTestFramework;

namespace MyTests
{
    [TestClass]
    public class DateTimeFormatterTests
    {
        [DataTestMethod]
        [DataRow(2, 3, 2017, "en", "Thursday, March 2")]
        [DataRow(2, 3, 2017, "de", "Donnerstag, 2. März")]
        public void Long_date_without_year_should_match_expected(int day, int month, int year, string regionCode, string expected)
        {
            DateTimeFormatterformatter = new DateTimeFormatter("dayofweek month day", new[] { regionCode });
            string actual = formatter.Format(new DateTime(year, month, day));
            Assert.AreEqual(expected, actual);
        }
    }
}

我不明白为什么断言失败并出现以下错误:

{"Assert.AreEqual failed. Expected:<Thursday, March 2>. Actual:<‎Thursday‎, ‎March‎ ‎2>. "}

这是因为字符串的编码不同吗?

使用 UTF8 编码将两个字符串转换为字节数组后,字节数组的内容如下所示:

实际:
e2 80 8e 54 68 75 72 73 64 61 79 e2 80 8e 2c 20 e2 80 8e 4d 61 72 63 68 e2 80 8e 20 e2 80 8e 32

预计: 54 68 75 72 73 64 61 79 2c 20 4d 61 72 63 68 20 32

八位字节 e2 80 8e 表明 actual 字符串中有几个 U+200E 字符。 U+200E 是一个控制字符,用于覆盖 bi-directional 文本算法并坚持将后面的内容写成 left-to-right,即使是通常写成 [= 的大小写(例如希伯来语或阿拉伯语字符) 21=].

expected 字符串中没有。

据推测,该控制字符已被复制到您的测试数据或您正在测试的格式化程序的实际源代码中。在后一种情况下,很高兴测试发现了它。 (或者,也许出于某种原因它应该在那里)。