← Все вопросы
Почему русский текст в UTF-8 занимает больше байт, чем кажется по числу букв?
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 байта.
Ваш ответ
Войдите, чтобы ответить на вопрос.