Как узнать количество символов в UTF8 массиве?(Си)
Char arr[]={"Кириллица Latin"};
Я пользовался всегда UTF16 широкими символами, хочу перейти на UTF8.
В UTF8 количество Байт на символ различаются, поэтому количество Байт в массиве не соответствует количеству символов в массиве.
Есть ли простой способ узнать количество символов в UTF8 массиве?
И ещё как можно например сравнить элемент UTF8 массива с чем либо?
Например if(arr[0]==L'Я')
Так ведь не получится, потому что буква Я занимает 2 Байта.
Мне кажется или UTF8 очень неудобный?
Есть разные подходы.
1. Выполнять обработку строк в UTF-16 или (лучше) в UTF-32. Если данные в UTF-8, они преобразуются в одну из этих кодировок. В UTF-16 один символ может кодироваться парой кодов. В UTF-32 такого нет.
2. Использовать специальные функции для работы с UTF-8, или самому написать соответствующий код. В этом случае русская буква - это не символ, а строка.
Для того чтоб пробежаться по строке, ты привык использовать инкремент индекса. При работе с UTF-8 последовательно определяют длину каждого символа, так перебирают символы строки.
Функция mblen возвращает длину символа в байтах
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/mbclen-mblen-mblen-l
Пишут, что mblen может возвращать значение до 3. Это странно, поскольку в UTF-8 символ может кодироваться 4 байтами.
Можно сделать по-хитрому! Смотри как. Чтобы это что-либо было тоже в UTF-8! Можно заставить работать Студию в UTF-8, есть специальные настройки для редактора и компилятора. Компилер ресурсов тоже прекрасно работает с UTF-8, главное включить соответствующую опцию. (Про Линукс объяснять не буду, там UTF-8 из коробки.) Вот и всё. БААМ, и в программе и в тексте у тебя везде UTF-8, и тебе тогда нужно просто заюзать стандартную memcmp(). Единственная проблема: узнать длинну символа. Тебе нужно будет написать свою функцию для этого. (смотри Википедию) А на основе её, ещё функцию длины строки. И на 99% это покроет все варианты. За исключением лексики, таких, как: tolower(), toupper() и т. д. (Хотя, в десятке могли поддержку уже добавить, я не слежу за этим...)