Символы против байтов: почему ваш текст больше, чем вы думаете
Вы вставляете строку длиной около 100 символов в поле с ограничением в 100 символов, и она отклоняется как слишком длинная. Как? Ответ в том, что символ и байт — это не одно и то же, и разрыв между ними, невидимый, пока он вас не укусит, — один из самых запутанных моментов работы с текстом. Вот что на самом деле происходит.
Основное различие
В простом ASCII, основных английских буквах, цифрах и обычных символах, один символ равен ровно одному байту, поэтому значения совпадают, и никто об этом не думает. Но Интернет работает в UTF-8 — кодировке, в которой символы, не входящие в этот базовый набор, занимают более одного байта каждый. Буква с ударением, такая как é, занимает два байта. Многие азиатские символы занимают три байта. Эмодзи обычно имеют размер четыре байта. Таким образом, количество байтов, занимаемых вашим текстом, может быть намного больше, чем количество символов, которые вы видите, и полностью зависит от того, что это за символы.
Почему размер байта имеет значение
Этот разрыв имеет значение, поскольку многие ограничения определяются в байтах, а не в символах. Поля базы данных часто имеют размер в байтах, поэтому поле, содержащее 100 байт, может вместить только 50 символов, если оно многобайтовое. Полезная нагрузка сети, ограничения размера сообщения и квоты хранилища измеряются в байтах. Некоторые API ограничивают тело запроса размером в байтах. Именно поэтому текст, который выглядит значительно ниже ограничения на количество символов, может быть отклонен как слишком длинный, ограничение было в байтах, а ваши буквы с акцентом или смайлы увеличили количество байтов, хотя количество символов выглядело нормально.
Как UTF-8 назначает байты
UTF-8 изначально имеет переменную ширину. Он кодирует основные латинские буквы и цифры в один байт каждая, что обеспечивает компактность простого английского текста и побайтовую идентичность. Помимо этого, он использует два байта для большинства латинских и греческих символов с акцентом, три байта для большого диапазона, включая большинство китайских, японских и корейских символов, и четыре байта для остальных, включая большинство эмодзи и некоторые редкие шрифты. Таким образом, строка из 100 символов может занимать от 100 до 400 байт в зависимости от ее содержимого. Твит с эмодзи намного тяжелее, чем твит с простыми буквами.
Смайлик-сюрприз
Эмодзи заслуживают особого упоминания, поскольку они вызывают больше всего путаницы. Большинство смайлов имеют четыре байта в UTF-8, а некоторые, созданные путем объединения нескольких кодовых точек, например определенных флагов или вариантов цвета кожи, даже больше. Таким образом, один смайлик может использовать столько же байтового пространства, сколько четыре простых латинских символа, а составной смайлик может использовать гораздо больше. Сообщение, которое визуально короткое, но содержит большое количество смайлов, может неожиданно превысить ограничение в байтах. Если вам когда-либо отклоняли короткое сообщение, наполненное смайликами, вот почему.
Практический вывод
Когда лимит определен в символах, в большинстве ограничений на публикации в социальных сетях учитываются символы. Когда предел определен в байтах, многие поля базы данных, API и протоколы подсчитывают байты, и помните, что акценты и смайлики увеличивают количество байтов. Если вы не уверены, какой формат использует система, и ваш текст содержит что-либо помимо обычного ASCII, на всякий случай проверьте размер байта. Увидев оба числа одновременно, вы избавитесь от догадок и предотвратите отказ «но оно выглядело достаточно коротким».