Как UTF-8 помещается в char?

Задался вопросом как символ UTF-8 помещается в тип char, который, например, в C имеет размер в 1 байт, а юникод по логике вещей и если верить википедии может занимать от 1 до 6 байт. Так вот никак не могу понять, как бы это стыдно не было, как юникод помещается в char? Как, например, выводятся русские буквы в консоли? Может кто-нибудь прояснить эту ситуацию для меня?
  • Вопрос задан
  • 8484 просмотра
Пригласить эксперта
Ответы на вопрос 4
TrueBers
@TrueBers
Гуглю за еду
А никак не помещается.
Потому что Си не поддерживает обработку строк в UTF-8. Для этого нужны сторонние библиотеки, которые умеют делать нормализацию, считать длину строки в абстрактных символах, а не кодпоинтах, и т. д. Поддержки этого всего у Си и C++ из коробки нет.
Ну, вы можете, конечно, запихнуть UTF-8 поток в массив char'ов, но ни одна нативная функция для работы со строками не будет с ним работать правильно. Даже длину строки никогда не сможет посчитать.

Поэтому, ответ прост: в C/C++ для работы с UTF8 используйте стороннюю библиотеку.
И да, никогда не используйте wchar_t нигде, где не можете этого избежать, например, в апи сторонних библиотек. wchar_t это тупо костыль в дизайне языка, который признали даже создатели этих языков.
Ответ написан
@abcd0x00
Есть Unicode - это огромная таблица всех символов в мире. У них там свои номера, которые никак не меняются (все символы пронумерованы). И вот для этого юникода есть кодировки, одна из которыз UTF-8 (а другие - UTF-16, UTF-32). Что такое кодировка - это таблица из последовательностей байт, отображаемых на символы. Одна последовательность байт ставится в соответствие одному символу. Соответственно, одна последовательно байт с помощью UTF-8 ставится в соответствие одному символу в Unicode (по его номеру). И наоборот, одному символу в Unicode (его номеру) ставится в соответствие одна последовательность байт в кодировке UTF-8. То есть туда-сюда можно переводить.

Дальше ты читаешь последовательность байт и её можно превратить в одно число по определённому алгоритму и потом это число уже берётся в юникоде и там смотрится символ.

Сама кодировка UTF-8 (закон преобразования) очень просто устроена: она берёт первый байт, в нём записано, сколько там ещё байт нужно взять. Потом эти байты берутся и целиком рассматриваются в виде непрерывной последовательности бит, из которой можно составить число. И потом это число ищется в юникоде уже.

Дальше ты хочешь понять, а что же такое cp1251. Это тоже кодировка, но она никак не связана с Unicode. Вместо Unicode там используется другая таблица (очень маленькая табличка на 256 символов), поэтому там хватает одного байта, чтобы получить код любого символа в этой таблице. И в ней как раз есть своя кириллица, поэтому для неё кириллица помещается в один байт.
Ответ написан
Комментировать
RiseOfDeath
@RiseOfDeath
Диванный эксперт.
Вы же сами ответили на свой вопрос - используется от 1 до 6 char`ов.
Ответ написан
@rassant
а как привести число в букву?
например в юникоде 'ф' это 1092.
Как можно это число перевести в букву? wchar_t не работает, и само собой char тоже не работает
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы