Что такое длина строки?

Длина строки зависит от того, что именно считать. Пользователь видит символы, а программы считают кодовые точки, 16-битные единицы кода UTF-16 или байты, и эти значения часто различаются. Эмодзи 👍🏽 выглядит как один символ, но состоит из 2 кодовых точек, 4 единиц кода UTF-16 и 8 байт UTF-8. JavaScript, Java и C# возвращают количество единиц кода UTF-16, базы данных часто ограничивают количество байт, а поля форм могут считать переводы строк как два символа.

Описание инструмента

Этот инструмент одновременно показывает длину строки в четырех единицах и проверяет ее на соответствие минимальной и максимальной длине. Используйте его, чтобы узнать, помещаются ли имя пользователя, заголовок или значение базы данных в заданное ограничение, или понять, почему две программы сообщают разную длину одного и того же текста. Если строка слишком длинная, вы получите усеченную копию, соответствующую ограничению и не разрезанную посередине символа.

Возможности

  • Подсчитывает символы, кодовые точки Unicode, единицы кода UTF-16 и байты UTF-8
  • Проверяет длину на соответствие необязательным минимальному и максимальному значениям в выбранной единице измерения
  • Показывает, сколько единиц осталось до ограничения, не хватает или превышает его
  • Усечет слишком длинную строку, не разделяя эмодзи, флаги или буквы с диакритическими знаками
  • Может игнорировать начальные и конечные пробельные символы
  • Может считать переводы строк как CR LF, как это делают HTML-формы при отправке данных

Как это работает

Символы — это графемные кластеры, то есть единицы, которые человек воспринимает как один символ; они определяются с помощью встроенного в браузер сегментирования текста Unicode. Кодовые точки — это значения Unicode в строке. Единицы кода UTF-16 — это то, что возвращает String.length в JavaScript: символы за пределами базовой многоязычной плоскости, например большинство эмодзи, занимают две единицы. Байты UTF-8 — это размер строки в кодировке UTF-8. При усечении сохраняются целые символы, пока добавление следующего не приведет к превышению максимального значения.

Советы

  • Для ограничения VARCHAR в MySQL или varchar в PostgreSQL проверяйте длину по кодовым точкам Unicode. Для ограничения в байтах, например для ключа индекса или поля сетевого протокола, проверяйте длину в байтах UTF-8.
  • Атрибут maxlength у HTML-поля ввода считает единицы кода UTF-16, поэтому один эмодзи может занимать две единицы.
  • Браузеры отправляют переводы строк в textarea как CR LF, поэтому сервер, проверяющий длину, может считать каждый перевод строки дважды. Включите параметр CR LF, чтобы использовать тот же способ подсчета.