2012-02-27 72 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