Перейти к содержанию

Конвертер текста в UTF-8, UTF-16, CP1251, KOI8-R и CP866

Вставьте текст — конвертер покажет его байты в UTF-8, кодовые единицы UTF-16 и байты в однобайтовых кириллических кодировках, а заодно соберёт строку и массив на C для прошивки. В обратную сторону он раскодирует байты из любой из этих кодировок и укажет, где последовательность UTF-8 нарушена.

Исходные данные

Что преобразуем

любые символы Unicode, в том числе эмодзи

Результат

UTF-8
D0 9F D1 80 D0 B8 D0 B2 D0 B5 D1 82 2C 20 D0 BC D0 B8 D1 80 21
21 байт на 12 символов
Коды символов
U+041F U+0440 U+0438 U+0432 U+0435 U+0442 U+002C U+0020 U+043C U+0438 U+0440 U+0021
UTF-16 (кодовые единицы)
041F 0440 0438 0432 0435 0442 002C 0020 043C 0438 0440 0021UTF-16LE в памяти: 1F 04 40 04 38 04 32 04 35 04 42 04 2C 00 20 00 3C 04 38 04 …
CP1251
CF F0 E8 E2 E5 F2 2C 20 EC E8 F0 2112 байт
KOI8-R
F0 D2 C9 D7 C5 D4 2C 20 CD C9 D2 2112 байт
CP866
8F E0 A8 A2 A5 E2 2C 20 AC A8 E0 2112 байт

Строка для прошивки на C

/* "Привет, мир!" in UTF-8, 21 bytes */
const char text[] = "\xD0\x9F\xD1\x80\xD0\xB8\xD0\xB2\xD0\xB5\xD1\x82, \xD0\xBC\xD0\xB8\xD1\x80!";
const uint8_t bytes[21] = { 0xD0, 0x9F, 0xD1, 0x80, 0xD0, 0xB8, 0xD0, 0xB2, 0xD0, 0xB5, 0xD1, 0x82, 0x2C, 0x20, 0xD0, 0xBC, 0xD0, 0xB8, 0xD1, 0x80, 0x21 };

Расчёт выполнен по формулам и данным из источников, приведённых на этой странице, и не заменяет проверку: параметры компонентов у разных производителей и даже партий различаются. Перед применением сверяйте результат с документацией на конкретные детали.

Текст в памяти микроконтроллера, в пакете UART или в файле — это байты, и одни и те же буквы в разных кодировках дают разные байты. Конвертер показывает текст сразу во всех распространённых кодировках и наоборот — восстанавливает текст из байтов.

UTF-8

UTF-8 кодирует символ Unicode одним–четырьмя байтами (RFC 3629, раздел 3):

Коды символовБайтыПример
U+0000 – U+007F0xxxxxxx«A» → 41
U+0080 – U+07FF110xxxxx 10xxxxxx«П» (U+041F) → D0 9F
U+0800 – U+FFFF1110xxxx 10xxxxxx 10xxxxxx«€» (U+20AC) → E2 82 AC
U+10000 – U+10FFFF11110xxx 10xxxxxx 10xxxxxx 10xxxxxxU+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.

Однобайтовые кириллические кодировки

КодировкаГде встречается«А»«я»«Ё»
CP1251WindowsC0FFA8
KOI8-RUnix, почта 1990-хE1D1B3
CP866DOS, консоль Windows80EFF0

В каждой из них 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 занимают две кодовые единицы — суррогатную пару.

Источники

  1. F. Yergeau. RFC 3629: UTF-8, a transformation format of ISO 10646. 2003 — раздел 3 — схема кодирования, раздел 4 — допустимые последовательности, раздел 7 — примеры (эталон тестов)
  2. P. Hoffman, F. Yergeau. RFC 2781: UTF-16, an encoding of ISO 10646. 2000 — раздел 2.1 — суррогатные пары; раздел 5 — пример U+12345 в UTF-16BE и UTF-16LE (эталон тестов)
  3. WHATWG. Encoding Standard — индексы windows-1251, KOI8-R и IBM866, которыми декодируются однобайтовые кодировки
  4. 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>

Обновлено .

Нашли ошибку в расчёте?