我想編寫代碼來比較兩個字符串。 在Windows中,我可以使用strcmp,但我想寫多字節字符串,以便它與所有其他平臺兼容 我可以使用memcmp嗎? 如果沒有,那麼是否有任何其他API可以使用,或者我需要編寫自己的API。我可以使用memcmp兩個比較多字節字符串嗎?
回答
如果字符串都使用相同的編碼,memcmp
將正常工作。請記住,不同平臺上的寬字符大小不同。
如果這些字符串使用不同的編碼,則需要一個庫(如ICU)來處理它。
如果兩個字符串使用相同的編碼,則可以使用memcmp
。如果他們使用的是UTF-8,那麼甚至可以使用strcmp
,因爲0不會以UTF-8編碼的字符串出現。另一種選擇是使用mbstowcs
將字符串轉換爲寬字符。
這會產生誤報 - 兩個相同的字符串可以編碼成不同的字節模式。您需要與Unicode精明的功能進行比較。 – StilesCrisis 2012-02-27 06:40:17
@StilesCrisis - 你能舉一個例子說明相同的字符串可以有不同的UTF-8編碼嗎?或者,對於這個問題,其他任何signle編碼(如ISO 8859-1)如何發生?我確實指出,字符串需要使用相同的編碼。 – 2012-02-27 06:56:33
@Ted Hopp:使用UTF-8,您可以以超長形式編碼一個字符(解碼爲應該使用較短序列的值的序列:該句子來自維基百科)。在這種情況下,memcmp返回錯誤的答案,但UTF-8意識到比較函數返回正確的答案... – Malkocoglu 2012-02-27 07:50:36
你必須小心。我不是Unicode /多字節編碼方面的專家,但是我知道,有了變音符,有時兩個字符串在字節不完全相同時可以被認爲是相等的。建議使用預先測試的API,因爲字符串編碼會變得非常混亂。
參見the old new thing on case mapping。我想不出一個關於變音符號的參考,但如果我這樣做,我會發布它。
這是正確的。對於某些情況,'memcmp'將起作用。爲了100%正確,特別是如果涉及任何形式的Unicode,'memcmp'將不起作用。即使像'é'這樣的簡單字符也可以用一種以上的方式來表示,或者用'é'(一個Unicode字符),或者用'e'(用兩個Unicode字符)來組合。大多數時候,這些都不會混雜和匹配,所以一開始可能看不到任何問題,但最終它會咬你。 – StilesCrisis 2012-02-27 06:38:10
如果您的比較不區分大小寫,另一種可以「考慮」字符串的方式相同,但字符不相等。在這種情況下,您需要執行所謂的案例摺疊,它可以比較大寫字母,小寫字母,標題大小寫和大小寫不變的字形(如上所述,可以將內存表示爲多個代碼點或不)。 – Bingo 2012-02-27 06:44:52
標準化後的等同不等於相同的東西。這是正常化的關鍵。 OP詢問兩個字符串字符串是否相等,而不是它們是否相等。 – 2012-02-27 06:57:33
- 1. 我可以用equals()方法比較多個字符串嗎?
- 2. 我可以使用三重等於JavaScript字符串比較嗎?
- 3. 比較兩個字符串[]
- 4. 比較兩個字符串?
- 5. 比較兩個字符串
- 6. 使用MYSQL比較兩個字符串
- 7. 使用SPARQL比較兩個字符串
- 8. 多個字符串比較
- 9. 比較兩個字符串以找到匹配的字符串
- 10. 你可以用==比較字符嗎?
- 11. C++比較兩個字符串文字
- 12. 比較兩個數字字符串值
- 13. 比較兩個字符串由字母
- 14. 爲什麼我可以使用「==」來比較兩個字符串,而不是兩個字符數組?
- 15. 我可以將一個字符串與一個數字進行比較嗎?
- 16. 更快的內存比較相等16個字節塊比memcmp
- 17. 我可以使用BLAST比較2個非生物字符串嗎?
- 18. 我可以在字符串中存儲邏輯比較嗎?
- 19. 比較兩組字符串
- 20. 比較字符串兩場
- 21. 我可以在一個字符串中使用str_replace兩次嗎?
- 22. 比較字節[]通過的PInvoke memcmp結合多線程
- 23. 用連接字符串比較兩個字符串數組VB.NET
- 24. 逐字比較.NET中兩個字符串的比較
- 25. 我需要將void輸出轉換爲字符串,以便我可以比較兩個字符串
- 26. 字符串(C) - 比較兩個字符串的字母
- 27. 我如何使用Perl比較兩個字符串
- 28. 比較多個字節
- 29. PHP不能比較兩個「字符串」
- 30. 比較兩個XML字符串
這取決於兩個字符串是否使用相同的編碼。 – 2012-02-27 06:24:14