2011-02-07 113 views
16

我今天剛剛遇到這個問題,並想知道如果有人有任何想法爲什麼這個測試可能會失敗(取決於文化)。目的是檢查測試文本是否包含彼此相鄰的兩個空格,根據string.IndexOf(即使我告訴字符串替換所有出現的彼此相鄰的兩個空格)。經過一些測試,似乎\xAD在某種程度上導致了這個問題。字符串IndexOf並替換

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); 
    } 
} 
+0

我不確定這是否會成爲您的問題,但如果您在此測試中彼此相鄰有3個空格,那麼您最終會在最後以2個爲一個。 – 2011-02-07 15:42:03

+0

測試成功了我。您確定您發佈的代碼與您正在測試的代碼相同嗎? – 2011-02-07 15:54:49

回答

16

是的,我以前遇到過同樣的事情(雖然有不同的字符)。基本上IndexOf將在查找匹配時考慮「特殊」Unicode字符的各個方面,而Replace只是將字符串視爲一系列代碼點。

IndexOf docs

此方法執行字(區分大小寫和文化敏感)使用當前區域性搜索。搜索從此實例的第一個字符位置開始,並一直持續到最後一個字符位置。

...和從Replace

此方法執行一個序(區分大小寫和不區分區域性)搜索找到的屬性oldValue。

你可以使用的IndexOf超載,這需要StringComparison,並迫使它雖然執行序號比較。