Текст в памяти микроконтроллера, в пакете UART или в файле — это байты, и одни и те же буквы в разных кодировках дают разные байты. Конвертер показывает текст сразу во всех распространённых кодировках и наоборот — восстанавливает текст из байтов.
UTF-8
UTF-8 кодирует символ Unicode одним–четырьмя байтами (RFC 3629, раздел 3):
| Коды символов | Байты | Пример |
|---|---|---|
| U+0000 – U+007F | 0xxxxxxx | «A» → 41 |
| U+0080 – U+07FF | 110xxxxx 10xxxxxx | «П» (U+041F) → D0 9F |
| U+0800 – U+FFFF | 1110xxxx 10xxxxxx 10xxxxxx | «€» (U+20AC) → E2 82 AC |
| U+10000 – U+10FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx | U+233B4 → F0 A3 8E B4 |
Первые 128 символов совпадают с ASCII, поэтому английский текст в UTF-8 не меняется. По первому байту видно длину последовательности, по старшим битам 10 — байты-продолжения. Раздел 4 RFC 3629 запрещает избыточные формы (C0 80 вместо 00), коды суррогатов U+D800–U+DFFF и всё, что выше U+10FFFF; байты C0, C1 и F5–FF в UTF-8 не встречаются вообще. Режим «Байты → текст» проверяет именно эти правила и показывает номер первого неправильного байта.
UTF-16
UTF-16 хранит символы до U+FFFF одной 16-битной кодовой единицей, а остальные — двумя: из кода вычитают 0x10000, старшие 10 бит прибавляют к 0xD800, младшие — к 0xDC00 (RFC 2781, раздел 2.1). В памяти единицы лежат в порядке байтов процессора: у little-endian процессора — как UTF-16LE. Метка порядка байтов U+FEFF в начале файла выглядит как FF FE в LE и FE FF в BE.
Однобайтовые кириллические кодировки
| Кодировка | Где встречается | «А» | «я» | «Ё» |
|---|---|---|---|---|
| CP1251 | Windows | C0 | FF | A8 |
| KOI8-R | Unix, почта 1990-х | E1 | D1 | B3 |
| CP866 | DOS, консоль Windows | 80 | EF | F0 |
В каждой из них 256 позиций и только символы из своей таблицы: символа «€» в KOI8-R нет, и конвертер честно об этом сообщает. Полные таблицы трёх кодировок и ASCII — на странице «Таблица ASCII и кириллица».
Строка для прошивки
Во что превратится строковый литерал с русскими буквами, зависит от кодировки исходного файла и настроек компилятора, поэтому надёжнее явно записать нужные байты — конвертер собирает строку с экранированием \x и массив uint8_t. Если после кода \xNN в строке идёт символ, похожий на шестнадцатеричную цифру, строка разбивается на две соседние — "\xC3\xA9" "a", иначе компилятор воспримет цифру как продолжение кода. Длина такой строки в байтах — это и есть то, что уйдёт в UART или займёт память; для CRC пакета с текстом пригодится калькулятор CRC.
Частые вопросы
Сколько байтов занимает русская буква в UTF-8?
Два. Кириллица Unicode лежит в диапазоне U+0400–U+04FF, а символы от U+0080 до U+07FF кодируются в UTF-8 двумя байтами (RFC 3629): «П» (U+041F) — D0 9F, «р» (U+0440) — D1 80. Латиница и цифры занимают один байт, символ евро — три, эмодзи — четыре. В CP1251, KOI8-R и CP866 любая русская буква — один байт.
Как вывести русский текст на дисплей или в UART микроконтроллера?
Узнать, в какой кодировке ждёт текст получатель. Терминал на компьютере обычно понимает UTF-8 — тогда строку можно хранить прямо в UTF-8, но её длина в байтах будет больше числа букв. Знакогенератор дисплея — свою таблицу символов: для HD44780 она разобрана на странице контроллера, и байты подбирают по ней. Конвертер даёт байты и строку с \x-кодами, которую можно вставить в код.
Почему вместо русского текста видны «кракозябры»?
Байты одной кодировки прочитали как другую. Например, UTF-8 «Привет» (D0 9F D1 80 …), прочитанный как CP1251, превращается ⠫Привет». Выберите в режиме «Байты → текст» разные кодировки: правильная даст осмысленный текст, а для UTF-8 конвертер ещё и проверит, допустима ли последовательность.
Чем UTF-16LE отличается от UTF-16BE?
Порядком байтов в 16-битных кодовых единицах: в BE старший байт первым, в LE — младший. RFC 2781 приводит пример: символ U+12345 и «=Ra» в UTF-16BE — D8 08 DF 45 00 3D 00 52 00 61, в UTF-16LE — 08 D8 45 DF 3D 00 52 00 61 00. Символы за пределами U+FFFF занимают две кодовые единицы — суррогатную пару.
Источники
- F. Yergeau. RFC 3629: UTF-8, a transformation format of ISO 10646. 2003 — раздел 3 — схема кодирования, раздел 4 — допустимые последовательности, раздел 7 — примеры (эталон тестов)
- P. Hoffman, F. Yergeau. RFC 2781: UTF-16, an encoding of ISO 10646. 2000 — раздел 2.1 — суррогатные пары; раздел 5 — пример U+12345 в UTF-16BE и UTF-16LE (эталон тестов)
- WHATWG. Encoding Standard — индексы windows-1251, KOI8-R и IBM866, которыми декодируются однобайтовые кодировки
- Unicode Consortium. Microsoft cp1251 и cp866 to Unicode tables; A. Chernov. RFC 1489 (KOI8-R) — таблицы кодовых страниц для проверки байтов «Привет» (эталон тестов)
Встроить калькулятор на свой сайт
Скопируйте код и вставьте его в HTML страницы, статьи или вики. Виджет бесплатный, без рекламы, счётчиков и cookie. Условие одно — ссылка на GAW под рамкой остаётся на месте. Подробнее о виджетах
<iframe src="https://gaw.ru/embed/utf8/" title="Конвертер текста в UTF-8, UTF-16, CP1251, KOI8-R и CP866" width="100%" height="640" style="border:1px solid #e3e5e9;border-radius:8px" loading="lazy" allow="clipboard-write"></iframe>
<p style="margin:6px 0 0;font-size:14px">Калькулятор: <a href="https://gaw.ru/tools/utf8/">Конвертер текста в UTF-8, UTF-16, CP1251, KOI8-R и CP866</a> — GAW.ru</p>Автоподстройка высоты рамки
Если сайт разрешает скрипты, добавьте этот код один раз в любом месте страницы: рамка будет менять высоту вместе с результатом расчёта.
<script>window.addEventListener("message",function(e){if(e.origin!=="https://gaw.ru"||!e.data||e.data.type!=="gaw:embed-height")return;var f=document.querySelectorAll('iframe[src^="https://gaw.ru/embed/"]');for(var i=0;i<f.length;i++)if(f[i].contentWindow===e.source)f[i].style.height=e.data.height+"px"})</script>Обновлено .
Нашли ошибку в расчёте?