string IndexOf和Replace

我今天刚刚遇到这个问题,并想知道是否有人知道为什么这个测试可能会失败(取决于文化)。 目的是检查测试文本是否包含彼此相邻的两个空格,这根据string.IndexOf (即使我告诉字符串将所有出现的两个空格替换为彼此)。 经过一些测试似乎\xAD在某种程度上导致了这个问题。

 public class ReplaceIndexOfSymmetryTest { [Test] public void IndexOfShouldNotFindReplacedString() { string testText = "\x61\x20\xAD\x20\x62"; const string TWO_SPACES = " "; const string ONE_SPACE = " "; string result = testText.Replace(TWO_SPACES, ONE_SPACE); Assert.IsTrue(result.IndexOf(TWO_SPACES) < 0); } } 

是的,我以前遇到过同样的事情(虽然有不同的角色)。 基本上, IndexOf会在查找匹配时将“特殊”Unicode字符的各个方面考虑在内,而Replace只会将字符串视为一系列代码点。

来自IndexOf文档 :

此方法使用当前文化执行单词(区分大小写和文化敏感)搜索。 搜索从此实例的第一个字符位置开始,一直持续到最后一个字符位置。

……来自Replace

此方法执行序数(区分大小写和区分大小写)搜索以查找oldValue。

您可以使用带有StringComparisonIndexOf的重载,并强制它执行序数比较。

像Jon说的那样,使用StringComparison.Ordinal来使它正确。

 Assert.IsTrue(result.IndexOf(TWO_SPACES, StringComparison.Ordinal) < 0);