Есть разные подходы.
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 байтами.
kh fjkgЗнаток (328)
3 года назад
>>Функция mblen возвращает длину символа в байтах
Пишут что для mblen нужна setlocale, я её вставил тоже.
mblen получает в качестве параметра массив и возвращает количество Байт на 1 символ??
А если в массиве разные типы символов с разным количеством Байт на символ?
Н всё равно неправильно выводит количество Байт даже только для кириллицы у меня. Выводит 1 Байт для кириллицы. Неправильно. Должно быть 2 Байта на символ.
Кодировку и Байты я проверял.
Может что то не так делаю?
setlocale(LC_ALL, ".1251");
char arr[]={"Кириллица Latin"};
printf("%d\n", mblen(arr, 2));
kh fjkgЗнаток (328)
3 года назад
>>так тоже работает setlocale(LC_CTYPE, ".utf8");
В Visual Studio кодировка в utf8 переводится, а в других компиляторах видимо нет.
char*p=setlocale(LC_ALL, ".utf8");
printf("%s\n", p);
kh fjkgЗнаток (328)
3 года назад
Жаль это функция не кроссплатформенная, мне она тоже нравится.
Но всё же с ней не всё так хорошо. Если копируешь часть utf8 массива, а не весь, то может вывестись мусор в конце.
kh fjkgЗнаток (328)
3 года назад
>>Visual Studio (как текстовый редактор) уже давно поддерживает UTF-8.
https://docs.microsoft.com/ru-ru/cpp/c-runtime-library/reference/setlocale-wsetlocale?view=msvc-170 начиная с версии Windows 10 1803 (10.0.17134.0), универсальная среда выполнения C поддерживает использование кодовой страницы UTF-8. Это означает, что char строки, передаваемые в функции среды выполнения C, будут ждать строк в кодировке UTF-8. Чтобы включить режим UTF-8, используйте ".UTF8" в качестве кодовой страницы при использовании setlocale . например, setlocale(LC_ALL, ".UTF8") будет использовать текущую стандартную кодовую страницу ANSI Windows (ACP) для языкового стандарта и кодировку UTF-8 для кодовой страницы.
Я пользовался всегда UTF16 широкими символами, хочу перейти на UTF8.
В UTF8 количество Байт на символ различаются, поэтому количество Байт в массиве не соответствует количеству символов в массиве.
Есть ли простой способ узнать количество символов в UTF8 массиве?
И ещё как можно например сравнить элемент UTF8 массива с чем либо?
Например if(arr[0]==L'Я')
Так ведь не получится, потому что буква Я занимает 2 Байта.
Мне кажется или UTF8 очень неудобный?