strlen () возвращает количество байтов.
Сокращение многобайтовой строки до определенного количества байтов является отдельной задачей. Вам нужно будет позаботиться о том, чтобы не обрезать строку в середине многобайтовой последовательности при ее сокращении.
Еще одна вещь, которую вам нужно обработать, это то, что когда вы помещаете строку в нотацию json, может потребоваться больше байтов, чтобы представить ее как json. Например, если ваша строка содержит символ двойной кавычки. Его нужно экранировать, и символ обратной косой черты добавит один байт. Есть и другие персонажи, от которых тоже нужно убежать. Дело в том, что оно может стать больше. Я предполагаю, что ограничение в байтах относится к общей полезной нагрузке json, поэтому вам необходимо учитывать сам синтаксис json, а также любые экранирования, которые json наложит на вашу строку.
Неоптимизированный, довольно хакерский способ сделать это - разрезать строку, скажем, на 5 байтов больше, чем ваш лимит, используя substr (). Теперь используйте mb_strlen (), чтобы получить количество символов, и mb_substr (), чтобы удалить последний символ. Теперь закодируйте его как json и измерьте байты с помощью strlen (). Введите цикл, который продолжает обрезать последний символ с помощью mb_substr (), кодирует как json и снова измеряет байты с помощью strlen (). Цикл завершается, когда допустимо количество байтов.