16 и 32 используются для хранения кода.
Русская Б в Unicode кодируется 2 байтами, поэтому нужно использовать char16_t, char8_t для нее не подойдет.
Или wchar_t (32 бита), который заполнит остальное 0-ми.
std::locale::global(std::locale("ru_RU.UTF-8"));
char16_t wCh = 0b010000010001;
char16_t wCh3 = 0x411;
char16_t wCh4 = u'Б';
Для вывода кастим к wchar_t , потому что для него есть перегрузка по выводу.
std::wcout << (wchar_t)wCh << " " << (wchar_t)wCh3 << " " << (wchar_t)wCh4 << '\n';
Я верно все понял ?
Почитай про стандарты кодирования unicode, и такие вопросы пропадут. utf-8: для кодирования использует 8-битные числа codepoint кодируется от 1 до 4 таких чисел, а раньше количество до 6 или 7 доходило, потом стандарт unicode запретил это для совместимости с utf-16. utf-16: для кодирования использует 16-битные числа codepoint кодируется от 1 до 2 (суррогатная пара) таких чисел. utf-32: использует 32 битные числа, тут никаких тонкостей, даже endianness нет.
кстати, а что в итоге делают с самыми длинными(которым нужны все 32 бита) кодпойнтами в случае utf-8 или 16? Сейчас таких просто не бывает? Просто не понимаю, зачем в стандарте намеренно ограничили длину кодирования
Любой символ это просто уникальный номер в таблице unicode. (Тут я сильно упрощаю для понимания, в unicode много сложностей) Просто этот номер символа, который влезает только в 32 бита будет кодироваться согласно стандарту кодирования utf-8 или utf-16. В кодировке utf-8 это будет 4 байта, а в utf-16 два 16-битных числа.
а как закодировать 32 битный код с помощью 4х 8битных, при условии что 1-2 бита от каждого байта(не помню, как именно там это устроено) кодируют только наличие продолжения, то есть используются в технических целях?
https://ru.wikipedia.org/wiki/UTF-8 Смотри "Алгоритм кодирования".
в подробности до сих пор(посыпаю пеплом голову, даже сейчас) не вдавался. Я к тому, что кодпойнты по нынешним стандартам кодирования не могут быть 32х битными. Я вполне понимаю, что сейчас никому не нужно набора из всех 2^32 символов, но после историй с unix time и «640 кб хватит всем» это выглядит малость недальновидно 🙂
Мне кажется, это сделано с заделом на будущее. Раньше считали и 16 бит хватит на все символы, но в итоге потом появились суррогатные пары... В unicode чего только не добавляют. Сейчас в unicode 1114112 символов, для кодирования этого числа нужно log 2 (1114112) + 1 = 21 бит.
вообще это я, конечно, малость оффтоплю, потому что по сути вообще мало чего знаю о юникоде (ну разве что кроме базовых штук как его использовать)
В таком случае лучше использовать готовые библиотеки типа ICU. Иначе надолго засядешь с этим unicode, там стооолько тонкостей). Например, один и тот же видимый символ может кодироваться разной последовательностью codepoint`ов. И как ты сделаешь сравнение строк или перевод символа в нужный регистр?
ну это понятно. Хорошо, что нужно это в основном для работы с текстом. Рендеринг обычно берет на себя ОС или библиотека, а хранить все вполне удобно в UTF-8
Обсуждают сегодня