【发布时间】:2012-03-16 16:15:49
【问题描述】:
我正在尝试编写代码来比较两个字符串。 在 Windows 中我可以使用 strcmp 但我想写多字节字符串,以便它与所有其他平台兼容 我可以使用 memcmp 吗? 如果没有,那么我可以使用任何其他 API,或者我需要编写自己的 API。
【问题讨论】:
-
这取决于两个字符串是否使用相同的编码。
标签: c++ string multibyte memcmp
我正在尝试编写代码来比较两个字符串。 在 Windows 中我可以使用 strcmp 但我想写多字节字符串,以便它与所有其他平台兼容 我可以使用 memcmp 吗? 如果没有,那么我可以使用任何其他 API,或者我需要编写自己的 API。
【问题讨论】:
标签: c++ string multibyte memcmp
你必须小心。我不是 Unicode/多字节编码方面的专家,但我知道使用变音符号有时可以认为两个字符串在它们的字节不完全相同时相等。建议使用预先测试过的 API,因为字符串编码会变得非常混乱。
见the old new thing on case mapping。我想不出关于变音符号的参考,但如果我想到了,我会发布它。
【讨论】:
memcmp 会起作用。为了 100% 的正确性,特别是如果涉及任何形式的 Unicode,memcmp 将不起作用。即使是像é 这样的简单字符也可以用不止一种方式表示——要么是é(一个Unicode 字符),要么是´ 结合e(两个Unicode 字符)。大多数情况下,这些不会混合和匹配,所以你可能一开始看不到任何问题,但最终它会咬你。
i 的大写字母不是I,而是İ(I 上面有一个点),I 的小写字母不是i,而是ı(无点) i),在这种情况下,您需要知道书写单词的语言。 :)
如果两个字符串使用相同的编码,您可以使用memcmp。如果他们使用 UTF-8 并且您的字符串不包含 NULL 字符 (U+0000),您甚至可以使用 strcmp,因为在没有 NULL 本身的情况下,UTF-8 编码字符串中不会出现 0 .另一种选择是使用mbstowcs 将字符串转换为宽字符。
【讨论】:
如果两个字符串都使用相同的编码,memcmp 可以正常工作。但是请记住,宽字符在不同平台上的大小不同。
如果字符串使用不同的编码,则需要ICU之类的库来处理。
【讨论】: