Сравнение кодовых последовательностей Unicode:
UTF-8 - это само каноническое представление. Две строки Unicode, которые составлены из одних и тех же кодовых точек Unicode, всегда будут кодироваться в одну и ту же последовательность байтов UTF-8 и, следовательно, могут сравниваться с memcmp
. Это необходимое свойство кодировки UTF-8, в противном случае его нельзя будет легко декодировать. Но мы можем пойти дальше, это верно для всех официальных схем кодирования Unicode, UTF-8, UTF-16 и UTF-32. Они кодируют строку в разные последовательности байтов, но всегда кодируют одну и ту же строку в одну и ту же последовательность. Если вы учитываете порядок байтов и независимость от платформы, UTF-8 является рекомендуемой схемой кодирования, поскольку вам не приходится иметь дело с порядками байтов при чтении или записи 16-битных или 32-битных значений.
Таким образом, ответ таков: если две строки кодируются с одинаковой схемой кодирования (например, UTF-8) и endiannes (это не проблема с UTF-8), результирующая последовательность байтов будет то же самое.
Сравнение строк Юникода:
Есть еще одна проблема, с которой сложнее справиться. В Unicode некоторые глифы (символ, который вы видите на экране или на бумаге) могут быть представлены одной кодовой точкой или комбинацией двух последовательных кодовых точек (называемых объединяющими символами ). Это обычно справедливо для глифов с акцентами, диакритическими знаками и т. Д. Из-за различного представления кодовой точки их соответствующая последовательность байтов будет отличаться. Сравнение строк с учетом этих комбинирующих символов не может быть выполнено с помощью простого сравнения байтов, сначала вы должны его нормализовать.
В других ответах упоминаются некоторые методы нормализации Unicode, канонические формы и библиотеки, которые вы можете использовать для преобразования строк Unicode в их обычную форму. Тогда вы сможете сравнить их побайтно с любой схемой кодирования.