我想编写代码来比较两个字符串。 在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