Ты говорил, что невозможно найти длину строки в UTF-8. Возможно найти длину строки. Надо просто перегнать байтовые в ширкосимвольные и применить wcslen().
size_t len = wcslen(L"здесь готские символы из диапазона 10330 — 1034F, которые ломают разметку Тостера :D ха-ха-ха.");
// вот вам пример крутой поддержки юникода от авторов самого посещаемого ИТ ресурса рунета, очень смешно
Что ты пытаешься показать, что "й" невозможно сравнить с "й"? Возможно их сравнить. И с чего ты взял, что прямая "й" и составная "й" должны быть равными?
Если ты не в курсе, они даже выглядят по-разному, когда их делаешь.
Canonical equivalence is a fundamental equivalency between characters or sequences of characters which represent the same abstract character, and which when correctly displayed should always have the same visual appearance and behavior.always — значит всегда, same — значит одинаковый. Если у вас что-то выглядит по-разному, значит установлены кривые шрифты или что-то не так настроено. Возможно, криво запатчен fontconfig патчами от народных умельцев. У меня выглядят они абсолютно идентично.
#include <stdio.h>
#include <locale.h>
#include <wchar.h>
#include <string.h>
int main(void)
{
setlocale(LC_ALL, "ru_RU.UTF-8");
mbstate_t state;
const char *iy_mb = u8"й";
const char *iyy_mb = u8"й";
memset(&state, 0, sizeof state);
size_t len = 1 + mbsrtowcs(NULL, &iy_mb, 0, &state);
wchar_t iy_w[len];
mbsrtowcs(&iy_w[0], &iy_mb, len, &state);
memset(&state, 0, sizeof state);
len = 1 + mbsrtowcs(NULL, &iyy_mb, 0, &state);
wchar_t iyy_w[len];
mbsrtowcs(&iyy_w[0], &iyy_mb, len, &state);
// wchar_t from u8 mb
wprintf(L"%ls\n", !wcscoll(iy_w, iyy_w) ? L"==" : L"!=");
wprintf(L"%ls\n", !wcscmp(iy_w, iyy_w) ? L"==" : L"!=");
// wchar_t
wprintf(L"%ls\n", !wcscoll(L"й", L"й") ? L"==" : L"!=");
wprintf(L"%ls\n", !wcscmp(L"й", L"й") ? L"==" : L"!=");
return 0;
}
[hv@main-hv tmp]$ clang -std=c11 -Wno-c99-compat -Weverything -pedantic test.c && ./a.out
!=
!=
!=
!=