2012-02-27 49 views
6

我想編寫代碼來比較兩個字符串。 在Windows中,我可以使用strcmp,但我想寫多字節字符串,以便它與所有其他平臺兼容 我可以使用memcmp嗎? 如果沒有,那麼是否有任何其他API可以使用,或者我需要編寫自己的API。我可以使用memcmp兩個比較多字節字符串嗎?

+3

這取決於兩個字符串是否使用相同的編碼。 – 2012-02-27 06:24:14

回答

1

如果字符串都使用相同的編碼,memcmp將正常工作。請記住,不同平臺上的寬字符大小不同。

如果這些字符串使用不同的編碼,則需要一個庫(如ICU)來處理它。

2

如果兩個字符串使用相同的編碼,則可以使用memcmp。如果他們使用的是UTF-8,那麼甚至可以使用strcmp,因爲0不會以UTF-8編碼的字符串出現。另一種選擇是使用mbstowcs將字符串轉換爲寬字符。

+0

這會產生誤報 - 兩個相同的字符串可以編碼成不同的字節模式。您需要與Unicode精明的功能進行比較。 – StilesCrisis 2012-02-27 06:40:17

+0

@StilesCrisis - 你能舉一個例子說明相同的字符串可以有不同的UTF-8編碼嗎?或者,對於這個問題,其他任何signle編碼(如ISO 8859-1)如何發生?我確實指出,字符串需要使用相同的編碼。 – 2012-02-27 06:56:33

+0

@Ted Hopp:使用UTF-8,您可以以超長形式編碼一個字符(解碼爲應該使用較短序列的值的序列:該句子來自維基百科)。在這種情況下,memcmp返回錯誤的答案,但UTF-8意識到比較函數返回正確的答案... – Malkocoglu 2012-02-27 07:50:36

5

你必須小心。我不是Unicode /多字節編碼方面的專家,但是我知道,有了變音符,有時兩個字符串在字節不完全相同時可以被認爲是相等的。建議使用預先測試的API,因爲字符串編碼會變得非常混亂。

參見the old new thing on case mapping。我想不出一個關於變音符號的參考,但如果我這樣做,我會發布它。

+0

這是正確的。對於某些情況,'memcmp'將起作用。爲了100%正確,特別是如果涉及任何形式的Unicode,'memcmp'將不起作用。即使像'é'這樣的簡單字符也可以用一種以上的方式來表示,或者用'é'(一個Unicode字符),或者用'e'(用兩個Unicode字符)來組合。大多數時候,這些都不會混雜和匹配,所以一開始可能看不到任何問題,但最終它會咬你。 – StilesCrisis 2012-02-27 06:38:10

+0

如果您的比較不區分大小寫,另一種可以「考慮」字符串的方式相同,但字符不相等。在這種情況下,您需要執行所謂的案例摺疊,它可以比較大寫字母,小寫字母,標題大小寫和大小寫不變的字形(如上所述,可以將內存表示爲多個代碼點或不)。 – Bingo 2012-02-27 06:44:52

+0

標準化後的等同不等於相同的東西。這是正常化的關鍵。 OP詢問兩個字符串字符串是否相等,而不是它們是否相等。 – 2012-02-27 06:57:33