Перейти к содержимому
LeedyBox
Поддержать

Как считаются слова и символы

Вставьте один и тот же текст в два приложения — и можете получить два разных результата. Ни один из них не обязательно ошибочен: просто они считают разные вещи. В этом руководстве объясняются распространённые единицы подсчёта и причины расхождений.

Четыре способа считать символы

Компьютеры хранят текст в Unicode, и «символ» можно измерять на нескольких уровнях:

  • Кластеры графем — то, что читатель воспринимает как один символ, например «é», «한» или «👍🏽».
  • Кодовые точки — отдельные значения Unicode. Один видимый символ может состоять из нескольких кодовых точек.
  • Кодовые единицы UTF-16 — то, что считает length в JavaScript и ряде других языков программирования. Символы за пределами базовой многоязычной плоскости (BMP), включая большинство эмодзи, занимают две единицы.
  • Байты UTF-8 — то, что хранится в файле или столбце базы данных. Буквы ASCII занимают один байт, латинские буквы с диакритикой обычно два, корейские, китайские и японские символы обычно три, а эмодзи — четыре и больше.
Текст Графемы Кодовые точки Единицы UTF-16 Байты UTF-8
a 1 1 1 1
é (одна кодовая точка) 1 1 1 2
é (e + комбинируемый диакритический знак) 1 2 2 3
한 (корейский слог) 1 1 1 3
👍 1 1 2 4
👍🏽 (с оттенком кожи) 1 2 4 8
👨‍👩‍👧 (эмодзи «семья») 1 5 8 18

Комбинируемые диакритические знаки и корейский текст

Некоторые символы можно хранить несколькими способами. «é» может быть одной готовой (precomposed) кодовой точкой или обычной «e», за которой следует комбинируемый диакритический знак. Выглядят они одинаково, но во второй форме на одну кодовую точку и на один байт больше. Текст, скопированный из некоторых систем, например имена файлов в отдельных операционных системах, может использовать разложенную форму.

В корейском та же проблема. Слог вроде «한» обычно хранится как одна кодовая точка, но его можно записать и отдельными чамо (ㅎ, ㅏ, ㄴ), которые объединяются на экране. Счётчик на основе графем в обоих случаях покажет 1, а подсчёт кодовых точек — 1 или 3. Нормализация Unicode (NFC или NFD) преобразует одну форму в другую.

Подсчёт слов в разных языках

В английском разбиение по пробелам даёт разумное число слов, хотя слова через дефис, сокращения, числа и URL разные инструменты всё равно могут считать по-разному.

Китайский, японский и тайский обычно пишут без пробелов между словами, поэтому при разбиении по пробелам целое предложение посчиталось бы одним словом. Более совершенные счётчики используют сегментатор слов, опирающийся на словари и правила. Счётчик LeedyBox использует Intl.Segmenter браузера, который определяет границы слов для многих языков. Сегментация в этих языках во многом условна, поэтому результаты могут отличаться от других инструментов или от подсчёта человеком. По этой причине некоторые издатели в этих языках считают символы, а не слова.

Почему приложения и сайты считают по-разному

Лимит вроде «не более 280 символов» или «VARCHAR(255)» в зависимости от системы может измеряться в графемах, кодовых точках, единицах UTF-16 или байтах. Некоторые сервисы также считают ссылку за фиксированное число символов или учитывают символы некоторых письменностей с большим весом. Если нужно уложиться в лимит, выясните, какую единицу использует целевая система, и сравнивайте с этим числом. Счётчик LeedyBox показывает графемы, единицы UTF-16 и байты UTF-8 рядом и включает проверку лимита, чтобы вы видели, насколько близки к нему в нужной единице.

Строки, абзацы и переносы строк

Число строк зависит от того, как хранятся переносы строк. Windows обычно использует два символа (CR LF), а Linux и macOS — один (LF). Инструмент, считающий «сырые» символы, может посчитать перенос строки Windows за два. Перенос строки в конце текста может считаться, а может и не считаться дополнительной пустой строкой. Абзацы обычно считаются как блоки, разделённые одной или несколькими пустыми строками, поэтому одиночный перенос строки внутри абзаца не начинает новый абзац.

Оценка времени чтения

Время чтения вычисляется делением числа слов на предполагаемую скорость чтения. Реальная скорость зависит от читателя, языка и того, насколько текст технический, а само число слов зависит от сегментации. Относитесь к этой оценке как к приблизительному ориентиру для планирования, а не как к измерению.

Часто задаваемые вопросы

Почему в некоторых приложениях один эмодзи считается за 2 символа?

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

Какой подсчёт использовать для лимита столбца базы данных?

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

Отправляет ли счётчик мой текст куда-нибудь?

Счётчик слов и символов LeedyBox работает в вашем браузере, поэтому вставленный текст подсчитывается на вашем устройстве.