2012-02-27 71 views
2

我使用NUnit v2.5來比較包含複合Unicode字符的字符串。
雖然比較本身工作正常,但表明第一個區別的插入符號似乎錯位。NUnit - 如何比較包含複合Unicode字符的字符串?

UPD:我已經結束了與重寫EqualConstraint,反過來調用自定義TextMessageWriter,所以我不再需要一個答案。請參閱以下解決方案。

這裏的片段:

string s1 = "ใช้งานง่าย"; 
string s2 = "ใช้งานงาย"; 
Assert.That(s1, Is.EqualTo(s2)); 

這裏的輸出:

Expected: "ใช้งานงาย" 
But was: "ใช้งานง่าย" 
------------------^ 

指示第一不同的字符中的箭頭似乎是關閉2個位置(多達有音以上標記)。對於更長的琴絃,它變成了一個真正的痛苦。我試過String.Normalize()但它也不管用。

我該如何解決這個問題?感謝您的幫助。請參閱下面的答案。

回答

0

您應該可以使用this answer中的代碼將每個字符串轉換爲原始字符串的轉義版本。複合字符將成爲一個單一的密碼轉義,而組合字符將是一系列這樣的轉義。然後在這些字符串的轉義版本上運行您的Assert

+0

不幸的是,這不是一種選擇。正確地指向十六進制轉儲中間的箭頭將更難以解釋,與指向原始文本的_misplaced_箭頭相比... – bytebuster 2012-02-28 23:28:24

1

當您比較Unicode字符串時,必須始終對比較的兩側進行標準化,並且採用相同的方式。對s1s2進行二進制比較是不夠的,因爲典型的等價字符串不會測試二進制等價。

對於四種標準化形式中的每一種,存在四個微不足道的歸一化函數,您可能想要測試NFD(s1)二進制等於NFD(s2)。在那裏使用NFDNFC並不重要,但是您必須對兩個字符串都做同樣的事情。

對於k-compat函數,NFKD和NFKD,這些函數在進行字符串搜索時很有用,因爲它們以某種精度爲代價提高了查全率。例如NFKD("™")將等於NFKD("TM")。例如,當您在文檔上運行搜索時,Adobe Reader會執行此操作:它始終以k-compat模式運行搜索,以便您的搜索更有機會找到所需內容。但是,與NFCNFD不同,k-compat函數NFKCNFKD會丟失信息並且不可逆。然而,使用簡單的NFDNFC,您總是可以回到另一個。

+0

謝謝您的想法。比較本身按預期工作;我認爲它始終是二進制的。 問題只與一個指示箭頭有關。 NUnit似乎基於char偏移量計算其長度。 「ใช้」和「ใช」分別佔用兩個佔位符,而字符串長度分別爲3和2。 此外,請注意差異發生得更多,但這個詞(樣本中的第一個詞)也會導致錯誤的偏移量。 – bytebuster 2012-02-28 23:15:19

+0

@bytebuster其中一個字符串中有U + 0348'THAI CHARACTER MAI EK',另一個字符串缺少。這個角色既是'\ p {Diacritic}'也是'\ p {Nonspacing_Mark}'字符。有一個字符串,它不會再像沒有它的字符串一樣,那麼咖啡廳*或*niño*會和* cafe *和* nino *一樣。 Unicode確實有一種容忍這種差異的平等測試,但不是標準化。相反,它只是使用Unicode歸類算法以主要強度進行比較。因此,您需要將UCA1(s1)與UCA1(s2)進行二進制比較。 – tchrist 2012-02-28 23:23:31

+0

我明白你在Unicode方面的含義,但我不認爲這對NUnit有什麼幫助。用兩個詞來表達:我唯一需要的是箭頭縮短了兩個字符,例如' - ^'而不是'---- ^'。你能否詳細說明你的建議? – bytebuster 2012-02-28 23:37:41