Обрезаются символы при формировании файла RTF в библиотеке PHPRtfLite
11 августа 2019
Обрезка символов происходит из-за перегрузки строковых функций. Объявление перегрузки происходит через настройку PHP mbstring.func_overload. Значение настройки можно узнать с помощью функции phpinfo() и если в mbstring.func_overload указано значение больше нуля (1, 2, 4), значит на сайте включена перегрузка строковых функций. Подробнее о механизме перегрузки написано в документации https://www.php.net/manual/ru/mbstring.overload.php
и заменяем его на:
Сохраняем изменения и проверяем корректность создаваемых файлов RTF. Правка актуальная для символов из кодировки CP1251 (кириллица и латиница).
Без крайней необходимости этот способ не рекомендуется, так как в старых версиях PHP и приложениях, где используются однобайтовые строковые функции (strlen, strtoupper и подобные) при работе с многобайтовыми кодировками возникнут ошибки.
Решение 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 и подобные) при работе с многобайтовыми кодировками возникнут ошибки.