Могу ли я использовать memcmp два строки сравнения многобайтовых символов? - PullRequest
6 голосов
/ 27 февраля 2012

Я пытаюсь написать код для сравнения двух строк. В Windows я могу использовать strcmp, но я хочу написать для многобайтовой символьной строки, чтобы он был совместим со всеми другими платформами Могу ли я использовать memcmp? если нет, то есть ли другой API, который я могу использовать, или мне нужно написать свой собственный API.

Ответы [ 3 ]

5 голосов
/ 27 февраля 2012

Вы должны быть осторожны. Я не эксперт по Unicode / многобайтовым кодировкам, но я знаю, что с диакритическими знаками иногда две строки можно считать равными, если их байты не совпадают. Рекомендуется использовать предварительно протестированные API, потому что строковое кодирование может быть довольно запутанным.

См. старую новую вещь о сопоставлении дел . Я не могу придумать ссылку на диакритические знаки, но если я это сделаю, я опубликую ее.

2 голосов
/ 27 февраля 2012

Если две строки используют одинаковую кодировку, вы можете использовать memcmp.Если они используют UTF-8, а ваши строки не содержат символ NULL (U + 0000), вы даже можете использовать strcmp, поскольку в отсутствие самого NULL 0 не отображается в кодированных строках UTF-8,Другой вариант - преобразовать строки в широкие символы, используя mbstowcs.

1 голос
/ 27 февраля 2012

Если обе строки используют одинаковую кодировку, memcmp будет работать нормально. Имейте в виду, что широкие символы имеют разные размеры на разных платформах.

Если в строках используются разные кодировки, вам понадобится библиотека, такая как ICU, чтобы справиться с ней.

...