← Все вопросы

Почему русский текст в UTF-8 занимает больше байт, чем кажется по числу букв?

Задан 2 месяца назад835 просмотров3 ответа
15

Сохранил строку «Привет» в UTF-8, а файл по размеру больше, чем 6 байт. С английским «Hello» — ровно 5 байт, а с русским не сходится. Сколько байт реально занимает русская буква в UTF-8 и как тогда считать размер строки?

3 ответа

22
✓ Принятый ответ — помог автору

В UTF-8 размер символа переменный:

  • латиница, цифры,基овая пунктуация (ASCII) — 1 байт на символ;
  • кириллица — 2 байта на символ;
  • многие эмодзи — 4 байта.

Поэтому «Hello» = 5 байт, а «Привет» = 6 букв × 2 = 12 байт. Это не баг, а особенность UTF-8: он экономит на латинице и доплачивает на остальном.

Если нужна гарантированно 2 байта на ЛЮБОЙ символ — это уже UTF-16, там и латиница, и кириллица по 2 байта. А «русская буква = 1 байт» бывает только в однобайтовых кодировках вроде Windows-1251 или KOI8-R.

Глеб Степанов У меня там случайно нерусская «о» затесалась, тоже даёт лишние байты 😅 · 1 месяц назад
Константин Гаврилов В коде проверяется как len('Привет'.encode('utf-8')) → 12 · 1 месяц назад
9

В UTF-8 кириллица — 2 байта на букву, латиница — 1. Отсюда и разница: 6 русских букв = 12 байт.

3

Кириллица — 2 байта.

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект