Что изменить, чтобы кириллица выводилась правильно из программы, запускаемой из PHP?
Меня не слушаются настройки кодировки cайта (Apache+PHP7.2 на Ubuntu).
Есть две утилиты конвертации документов doc в txt.
В консоли (Linux) обе отображают кириллицу корректно! А на сайте одна выводит латиницей, другая вопросиками.
В самом начале страницы index.php я указываю, как положено
И сharset влияет на отображение русского текста в операторе echo. Если я выбираю utf-8, то echo выводит текст русскими буквами:
echo «Русский»;
Но вывод двух утилит не изменяется ни при каких кодировках!
catdoc
$text = shell_exec('/usr/bin/catdoc /test.doc'); echo $text; // выводит русский текст латиницей
$text = shell_exec( '/usr/bin/soffice --headless --convert-to txt --cat /test.doc'); echo $text; //выводит вопросики $text = shell_exec(/usr/bin/soffice --headless --convert-to "txt:Text (encoded):UTF-8" --cat /test.doc); echo $text; // выводит вопросики
Вообще-то мне и не нужно, чтобы на сайте был вывод из этих утилит. Мне нужно конвертировать их вывод в UTF-8 и передать дальше. Но я не могу конвертировать, пока не определю кодировку и подумал, что проще всего определить на сайте.
В РНР.ini и в .htaccess и в headere я устанавливал utf-8, windows-1251, ASCII, ANSI, KOI8-R и перегружал Апачи. Ничего не меняется.
shell_exec это плохой вариант по части безопасноти. Попробуйте PHPOffice использовать. Пример смог найти только в коде теста, но думаю что при желании можно будет разобраться: https://github.com/PHPOffice/PHPWord/blob/develop/.
Я изменил вопрос, так как не там устанавливал кодировку. Нужно было в самом начале кода рнр ставить оператор header, а я менял в рнр.ini и в заголовке HTML. Теперь я убрал вообще HTML и вывод echo СТАЛ ЗАВИСЕТЬ от кодировки в headere. То есть русские буквы в echo «Русский текст»; стали видны только при установке utf-8 в headere.
Да я попробовал по Вашему совету mb_internal_encoding.
Ну она устанавливает какую-то переменную для библиотеки mb и сама же ее считывает и зачем мне она? Пример на phpword мне тоже cейчас не нужен, так как у меня файлы doc, а не docx.
У меня проблема в том, что не меняется вывод утилит на экран (через echo), независимо от того, что я изменяю header. Что мне нужно изменить, чтобы они выводили по русски?
Проблемы безопасности меня тоже сейчас не интересуют — мне нужно всего лишь определить кодировку или гарантированно сконвертировать вывод утилит в UTF-8 для передачи в другой модуль программы.
В общем проблема оказалась вот в чем:
Оказалось, что для правильного отображения кириллицы на сайте нужно обязательно указать в параметрах catdoc одну из русских кодировок utf-8, koi8-r, cp866, cp1251 (не windows-1251). Без этого ключа вывод на сайте идет латиницей, несмотря на header.
Если я ставлю одну из этих кодировок, то вывод на экране зависит от установки в headere!
Вопрос закрыт! С soffice видимо та же проблема, разберусь. Точнее проблема с shell_exec. Как будто выходная кодировка по умолчанию не проходит через shell_exec. Какая она я так и не понял. В доке на сатdoc написано, что внутренняя кодировка unicode. В консоли (Ubuntu) сatdoc работает нормально без ключа -d.
Укажите принудительно локаль перед shell_exec
$locale='ru_RU.UTF-8'; setlocale(LC_ALL, $locale); putenv('LC_ALL='.$locale); $text = shell_exec('/usr/bin/catdoc /test.doc');