C++ 我可以使用memcmp两个比较多字节字符串吗?
我正在尝试编写代码来比较两个字符串。 在windows中,我可以使用strcmp,但我希望写入多字节字符串,以便它与所有其他平台兼容 我可以使用memcmp吗?C++ 我可以使用memcmp两个比较多字节字符串吗?,c++,string,multibyte,memcmp,C++,String,Multibyte,Memcmp,我正在尝试编写代码来比较两个字符串。 在windows中,我可以使用strcmp,但我希望写入多字节字符串,以便它与所有其他平台兼容 我可以使用memcmp吗? 如果没有,那么是否有其他API可以使用,或者我需要编写自己的API。如果字符串都使用相同的编码,memcmp可以正常工作。但是,请记住,宽字符在不同平台上的大小不同 如果字符串使用不同的编码,则需要ICU之类的库来处理。如果两个字符串使用相同的编码,则可以使用memcmp。如果他们使用UTF-8,并且字符串不包含空字符(U+0000),
如果没有,那么是否有其他API可以使用,或者我需要编写自己的API。如果字符串都使用相同的编码,
memcmp
可以正常工作。但是,请记住,宽字符在不同平台上的大小不同
如果字符串使用不同的编码,则需要ICU之类的库来处理。如果两个字符串使用相同的编码,则可以使用
memcmp
。如果他们使用UTF-8,并且字符串不包含空字符(U+0000),您甚至可以使用strcmp
,因为在没有空本身的情况下,0不会出现在UTF-8编码的字符串中。另一种选择是使用mbstowcs
将字符串转换为宽字符,您必须小心。我不是Unicode/多字节编码方面的专家,但我知道使用变音符号时,当两个字符串的字节不完全相同时,有时可以认为两个字符串相等。建议使用预先测试过的API,因为字符串编码可能会变得非常混乱
看。我想不出对变音符号的引用,但如果我这样做了,我会发布它。这取决于两个字符串是否使用相同的编码。这是正确的。在某些情况下,
memcmp
将起作用。对于100%的正确性,尤其是涉及任何形式的Unicode时,memcmp
将不起作用。即使是像é
这样的简单字符也可以用多种方式表示——要么表示为é
(一个Unicode字符),要么表示为与e
(两个Unicode字符)组合的'
。大多数情况下,它们不会被混合和匹配,所以一开始你可能看不到任何问题,但最终它会咬到你。字符串“被认为”相等,但字节不相等的另一种方式是,如果比较是大小写不变的。在这种情况下,您需要执行所谓的大小写折叠,它允许比较大写、小写、标题大小写和大小写不变图示符(如上所述,这些图示符可以在内存中表示为多个代码点…或不表示为多个代码点)。规范化后的相等与相等不是一回事。这就是正常化的全部意义。OP询问的是两个字符串是否相等,而不是它们是否相等。@宾果:案例处理更糟。在土耳其语中,i
的大写字母不是i
,它是i
(i
,上面有一个点),而i
的小写字母不是i
,它是ı
(dotlessi
),在这种情况下,你需要知道一个单词是用什么语言写的下面是关于各种Unicode规范化类型(字符编码的各种方式)的参考。注意,UTF8特别要求对字符进行尽可能短的编码,但这是UTF8所特有的,AFAIK——其他类型的Unicode更为宽松。这将产生误报——两个相同的字符串可以编码成不同的字节模式。您需要与熟悉Unicode的函数进行比较。@StilesCrisis-您能提供一个相同字符串如何具有不同UTF-8编码的示例吗?或者,就这一点而言,任何其他符号编码(如ISO 8859-1)如何实现这一点?我确实指出字符串需要使用相同的编码。@Ted Hopp:使用UTF-8,您可以将字符编码为超长形式(一个解码为应该使用较短序列的值的序列:这句话来自wikipedia)。在这种情况下,memcmp返回错误答案,但UTF-8感知比较函数返回正确答案…@Malkocoglu-从Unicode版本3.0开始,标准禁止生成非最短形式的UTF-8序列。(这是标准中的一致性条款C12。)使用超长格式编码的字符串未使用合法的UTF-8编码。(同一个维基百科页面在该部分下列出了“超长表单”。@Ted Hopp:如果对格式错误的UTF8字符串使用memcmp/strcmp,它们将返回OK,就像它们是有效序列一样。如果使用UTF8感知比较函数,则如果其中一个字符串格式不正确,它将/必须返回错误。这是我的观点,我也反对格式错误的UTF8。。。