Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我可以使用memcmp两个比较多字节字符串吗?_C++_String_Multibyte_Memcmp - Fatal编程技术网

C++ 我可以使用memcmp两个比较多字节字符串吗?

C++ 我可以使用memcmp两个比较多字节字符串吗?,c++,string,multibyte,memcmp,C++,String,Multibyte,Memcmp,我正在尝试编写代码来比较两个字符串。 在windows中,我可以使用strcmp,但我希望写入多字节字符串,以便它与所有其他平台兼容 我可以使用memcmp吗? 如果没有,那么是否有其他API可以使用,或者我需要编写自己的API。如果字符串都使用相同的编码,memcmp可以正常工作。但是,请记住,宽字符在不同平台上的大小不同 如果字符串使用不同的编码,则需要ICU之类的库来处理。如果两个字符串使用相同的编码,则可以使用memcmp。如果他们使用UTF-8,并且字符串不包含空字符(U+0000),

我正在尝试编写代码来比较两个字符串。 在windows中,我可以使用strcmp,但我希望写入多字节字符串,以便它与所有其他平台兼容 我可以使用memcmp吗?
如果没有,那么是否有其他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
,它是
ı
(dotless
i
),在这种情况下,你需要知道一个单词是用什么语言写的下面是关于各种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。。。