Символы и байты — не одно и то же
Число символов — это количество знаков, которые видит человек, а байты — объём, который текст занимает при хранении в компьютере. Один и тот же символ может занимать разное количество байтов в зависимости от кодировки (правила, переводящего символы в числа). Латинские буквы и цифры почти во всех кодировках занимают 1 байт, а корейский хангыль — 2 или 3 байта в зависимости от кодировки.
UTF-8: современный стандарт
UTF-8 — кодировка веб-страниц и большинства современных программ. В зависимости от величины номера Юникода (кодовой точки) она использует от 1 до 4 байтов (RFC 3629).
| Диапазон кодовых точек | Байты | Примеры |
|---|---|---|
| U+0000 ~ U+007F | 1 | Латиница, цифры, основные знаки |
| U+0080 ~ U+07FF | 2 | é, ñ, греческое, кириллическое и арабское письмо |
| U+0800 ~ U+FFFF | 3 | Хангыль, иероглифы, кана |
| U+10000 ~ U+10FFFF | 4 | Большинство эмодзи, древние письменности |
Все готовые слоги хангыля (от 가 до 힣, U+AC00~U+D7A3) лежат в третьем диапазоне, поэтому в UTF-8 один символ занимает 3 байта. Например, «안녕하세요» (здравствуйте) — это 5 символов и 15 байтов. Кстати, кириллица попадает во второй диапазон: русская буква в UTF-8 занимает 2 байта.
UTF-16
UTF-16, используемая внутри JavaScript, Java и Windows, хранит большинство символов в 2 байтах, а символы начиная с U+10000, такие как эмодзи, — в 4 байтах (суррогатная пара). Именно поэтому длина строки в JavaScript считает эмодзи за 2.
EUC-KR: корейская кодировка готовых слогов
EUC-KR основана на корейском промышленном стандарте KS X 1001. Латиница и цифры занимают 1 байт, символы из KS X 1001 — 2 байта. KS X 1001 содержит 2350 употребительных слогов хангыля, 4888 ханча (китайских иероглифов), кану, греческие и кириллические буквы и множество знаков.
Проблема в том, что из 11 172 слогов современного хангыля в набор входят лишь 2350. Отсутствующие слоги, такие как «똠», «햏» или «뷁», нельзя представить в базовом двухбайтовом EUC-KR. В приложении к стандарту есть способ комбинирования с использованием 8 байтов, но его поддерживают редкие программы, поэтому обычно символ превращается в «?» или возникает ошибка.
CP949: расширенная кодировка
CP949 (Unified Hangul Code от Microsoft) расширяет EUC-KR и кодирует все 11 172 слога современного хангыля двумя байтами. Поскольку это была корейская кодовая страница Windows по умолчанию, она широко распространена в старых корейских документах и системах. Привычное правило «латиница — 1 байт, хангыль — 2 байта» в основном пришло именно отсюда.
Когда важны байты
- SMS: корейские сервисы коротких сообщений обычно указывают для SMS лимит 90 байтов и считают хангыль по 2 байта — это около 45 корейских символов. При превышении сообщение становится длинным (LMS), и стоимость может измениться; точный лимит уточняйте у своего сервиса.
- Поля баз данных: если длина измеряется в байтах, как в VARCHAR2 в Oracle, 20 латинских и 20 корейских символов занимают разный объём. В базе данных с UTF-8 один слог хангыля занимает 3 байта.
- Государственные и банковские формы: формы, связанные со старыми системами, иногда ограничивают поля ввода в байтах.
Как считает этот инструмент
Байты UTF-8 точно вычисляются по кодовой точке каждого символа. Для EUC-KR и CP949 инструмент по реальной таблице символов каждой кодировки проверяет, можно ли представить символ двумя байтами. Непредставимые символы (эмодзи, отсутствующие в наборе слоги хангыля и т. п.) обычно заменяются однобайтовым «?», поэтому считаются за 1 байт, а их количество выводится отдельно. Если в режиме эссе выбрать основу «Байты (хангыль = 2)», подсчёт ведётся по CP949.
Актуально на: 2026-09-23