Обрезаются символы при формировании файла RTF в библиотеке PHPRtfLite

11 августа 2019
Обрезка символов происходит из-за перегрузки строковых функций. Объявление перегрузки происходит через настройку PHP mbstring.func_overload. Значение настройки можно узнать с помощью функции phpinfo() и если в mbstring.func_overload указано значение больше нуля (1, 2, 4), значит на сайте включена перегрузка строковых функций. Подробнее о механизме перегрузки написано в документации https://www.php.net/manual/ru/mbstring.overload.php

Решение 1

В библиотеке PHPRtfLite открываем файл /PHPRtfLite/Utf8.php и находим определение функции private static function utf8ToUnicode($str). Далее в функции ищем фрагмент:
for ($i = 0; $i < strlen($str); $i++ ) 

и заменяем его на:
for ($i = 0; $i < mb_strlen($str, 'cp1251'); $i++ ) 

Сохраняем изменения и проверяем корректность создаваемых файлов RTF. Правка актуальная для символов из кодировки CP1251 (кириллица и латиница).

Решение 2

Установить mbstring.func_overload в значение 0.
Без крайней необходимости этот способ не рекомендуется, так как в старых версиях PHP и приложениях, где используются однобайтовые строковые функции (strlen, strtoupper и подобные) при работе с многобайтовыми кодировками возникнут ошибки.