Длина строки

Измеряет строку сразу несколькими полезными способами, включая эмодзи и иврит.

Ввод
Символы
0
Кодовые точки
0
Единицы UTF-16
0
Слова
0
Строки
0

Почему у вопроса «какой длины этот текст?» больше одного ответа

Звучит как тривиальный вопрос, но длина фрагмента текста полностью зависит от того, что именно вы считаете. Человек считает символы, которые видит. База данных считает объём хранилища, который занимает значение. JavaScript считает нечто иное. Когда эти числа расходятся — а с эмодзи, буквами с диакритикой и нелатинскими письменностями это происходит часто — одна-единственная «длина» вводит в заблуждение. Этот инструмент показывает пять осмысленных мер рядом, чтобы вы выбрали ту, которая важна в вашем случае.

Пять метрик с пояснениями

  • Символы (графемы): то, что человек воспринимает как один символ. Эмодзи семьи вроде 👨‍👩‍👧 или буква с комбинирующим диакритическим знаком считаются за один — это счёт, который совпадает с подсчётом «на глаз».
  • Кодовые точки (code points): количество скалярных значений Unicode. Один видимый символ может состоять из нескольких соединённых кодовых точек, поэтому это число часто больше, чем количество графем.
  • Единицы UTF-16: значение, которое JavaScript возвращает из свойства .length строки. Символы за пределами базовой многоязычной плоскости (большинство эмодзи) занимают по две единицы UTF-16.
  • Слова: количество словоподобных токенов, определяемых с учётом Unicode, а не наивным разбиением по пробелам.
  • Строки: количество строк, с подсчётом каждого переноса строки.

Почему эмодзи и диакритика ломают наивный подсчёт

Современный текст построен на Unicode, который представляет многие видимые символы как последовательности, а не как отдельные единицы. Эмодзи флага — это два региональных символа-индикатора. Эмодзи семьи — это несколько фигур, соединённых невидимыми символами «соединитель нулевой ширины». Буква é может быть одной кодовой точкой или простой e с последующим комбинирующим знаком. Каждый из них выглядит как один символ, но может считаться за два, три или больше в зависимости от метрики. Именно поэтому ручной подсчёт или доверие одному числу приводят к ошибкам.

Какой счёт использовать?

  • Ограничения на символы, которые видят люди (биография, поле в стиле твита, предпросмотр SMS): используйте «Символы» (графемы), потому что это совпадает с тем, что считает пользователь.
  • Работа со строками в JavaScript, индексация или срезы: используйте единицы UTF-16, так как именно на них основаны .length и индексы строки.
  • Размеры столбцов базы данных: проверьте, измеряется ли ваш столбец в символах или в байтах — многие ограничены байтами, а байты UTF-8 снова отличаются от всех этих значений.
  • Подсчёт слов или строк для редакторов и читаемости: используйте метрики «Слова» и «Строки».

Частые вопросы

Какой счёт соответствует длине строки в JavaScript?
Значение единиц UTF-16 соответствует «сырому» свойству .length в JavaScript. Если ваш код режет или индексирует строки, именно это число определяет его поведение.
Почему один эмодзи считается несколькими символами?
Многие эмодзи состоят из нескольких соединённых кодовых точек Unicode. Как графема (то, что вы видите) это один символ, но его счётчики кодовых точек и UTF-16 выше, поэтому каждая мера показана отдельно.
Считает ли он завершающие пробелы и переносы строк?
Да. Считается каждый символ, который вы вставили, включая начальные и конечные пробелы и переносы строк. Если итоги кажутся больше ожидаемого, проверьте наличие невидимых конечных пробелов.
Отправляется ли мой текст куда-либо?
Нет. Весь подсчёт происходит в вашем браузере. Текст, который вы вводите или вставляете, никогда не покидает ваше устройство.
Что такое графема?
Графема, или «кластер графем», — это символ в том виде, в каком его воспринимает пользователь: наименьшая единица, которую читатель назвал бы одним символом, даже если она состоит из нескольких кодовых точек.
Чем байты отличаются от этих значений?
Байты зависят от кодировки. В UTF-8 буква ASCII занимает один байт, большинство символов с диакритикой и нелатинских — два или три, а многие эмодзи — четыре. Ни одна из пяти метрик здесь не является подсчётом байтов, поэтому для полей с ограничением по байтам сначала кодируйте в UTF-8.