【发布时间】:2021-04-07 12:13:04
【问题描述】:
我正在为一个旨在删除无效代码点(例如孤立代理对)的函数编写测试。 但是,我发现代理对的编码方式有所不同,具体取决于我编写测试的方式。
虽然此版本的测试通过:
[TestCategory("UnitTest")]
[TestMethod]
public void RemoveOrhpanedSurrogatePair()
{
var input = "\uDDDD1975";
var cleanText = input.ReplaceInvalidCodePoints();
Assert.AreEqual(input.Length - 1, cleanText.Length);
Assert.AreEqual("1975", cleanText);
}
这个没有:
[TestCategory("UnitTest")]
[TestMethod]
[DataRow("\uDDDD1975")]
public void RemoveOrhpanedSurrogatePair(string input)
{
var cleanText = input.ReplaceInvalidCodePoints();
Assert.AreEqual(input.Length - 1, cleanText.Length);
Assert.AreEqual("1975", cleanText);
}
查看调试器,第一个变体将字符串编码为"\uDDDD1975",但第二个变体生成"��1975",它显示为两个有效字符,而不是一个孤立的代理对。
【问题讨论】:
-
可以用任何属性重现相同的行为dotnetfiddle.net/Aux1H7
-
好像也是这样编译的sharplab.io/…
-
我猜这是罗斯林的问题
-
字符串是一个 unicode 字符数组。当输入不是有效字符时,任何事情都可能发生。
-
ECMA-335 CLI 规范在 I.24.2.4 中指出,
#Userstringblob 的任何可访问部分都应仅包含有效的 UTF16。这适用于普通字符串。因此,这将无法验证。而对于 I.23.3 中的自定义属性,它只需要一串代码点。
标签: c# string unicode encoding