Как правильно ссылаться на имена файлов Ubuntu в Юникоде в функции PHP shell_exec, вызывающей Tika - PullRequest
2 голосов
/ 01 ноября 2019

ОС: Ubuntu 18.04;PHP 7.2 ; tika: tika-app-1.22.jar;Java: openjdk version "1.8.0_222

sample-2.pdf, sample-2- 文字 .pdf, sample-2- で し た .pdf, sample-2- 수요 .pdf - идентичные файлы PDF, расположенные втот же каталог. Tika 1.22 используется для извлечения метаинформации из файла pdf. В терминале Linux приведенный ниже список командной строки Tika может генерировать правильные выходные данные для всех файлов pdf.

$ java -jar /opt/tika-app-1.22.jar -j sample-2.pdf >&1 2>/dev/null

$ java -jar /opt/tika-app-1.22.jar -j sample-2-文字.pdf >&1 2>/dev/null

$ java -jar /opt/tika-app-1.22.jar -j sample-2-でした.pdf >&1 2>/dev/null

$ java -jar /opt/tika-app-1.22.jar -j sample-2-수요.pdf >&1 2>/dev/null

Использование shell_exec()и exec() функции из PHP-программы для выполнения одного и того же набора команд, однако, дают разные результаты.

Пожалуйста, смотрите код PHP ниже:

<code><?php

$output1 = shell_exec('java -jar /opt/tika.jar -j sample-2.pdf >&1 2>/dev/null');
echo "<pre>$output1
";$ output2C = shell_exec ('java -jar /opt/tika.jar -j sample-2- 文字 .pdf> & 1 2> / dev / null');echo "
$output2C
";$ output2J = shell_exec ('java -jar /opt/tika.jar -j sample-2- で し た .pdf> & 1 2> / dev / null');echo "
$output2J
";$ output2K = shell_exec ('java -jar /opt/tika.jar -j sample-2- 수요 .pdf> & 1 2> / dev / null');echo "
$output2K
";$ c1 = exec ('java -jar /opt/tika.jar -j sample-2.pdf> & 1 2> / dev / null', $ output3, $ r);echo "
$output3

$ c1
$ r";$ c2 = exec ('java -jar /opt/tika.jar -j sample-2- 文字 .pdf> & 1 2> / dev / null', $ output4C, $ r);echo "
$output4C

$ c2
$ r";$ c2 = exec ('java -jar /opt/tika.jar -j sample-2- で し た .pdf> & 1 2> / dev / null', $ output4J, $ r);echo "
$output4J

$ c2
$ r";$ c2 = exec ('java -jar /opt/tika.jar -j sample-2- 수요 .pdf> & 1 2> / dev / null', $ output4K, $ r);echo "
$output4K

$ c2
$ r";?>

$ouput1 дает ожидаемый результат, а $output2C, $output2J, $output2K ничего не дает. Разница лишь в том, что имена файлов содержат символы CJK или нет.

Попытка подтверждения результатов с использованием функции exec(), см. Код выше, $output3 дает ожидаемые результаты, а $output4C, $output4J, $output4K - только пустой массив. И $ output1, и $ output3 дают ожидаемые результаты. Единственная разница с функцией exec () состоит в том, что три имени файла содержат символы CJK, а имя файла целиком состоит из символов ASCII.

Строки имени файла в качестве параметров, используемых в shell_exec() и exec() все функции отображаются в кодировке UTF-8, с китайскими символами или без них, проверено функцией mb_detect_encoding() в PHP.

В Apache error.log не выдается сообщение об ошибке. Единственная первопричина сужается до символов CJK Unicode в именах файлов, здесь я имею в виду символы CJK, не только китайские, но также японские и корейские.

Причина, по которой я указал stderr 2> / dev / nullпотому что Тика сгенерировала следующие предупреждающие сообщения:

Oct 31, 2019 8:51:47 PM org.apache.tika.config.InitializableProblemHandler$3 handleInitializableProblem
WARNING: J2KImageReader not loaded. JPEG2000 files will not be processed.
See https://pdfbox.apache.org/2.0/dependencies.html#jai-image-io
for optional dependencies.

Oct 31, 2019 8:51:47 PM org.apache.tika.config.InitializableProblemHandler$3 handleInitializableProblem
WARNING: org.xerial`s sqlite-jdbc is not loaded.
Please provide the jar on your classpath to parse sqlite files.
See tika-parsers/pom.xml for the correct version.

, которые не представляют интереса и не содержат сообщений о том, почему PHP shell_exec и exec не дали никаких выходных данных. Эти предупреждающие сообщения захватываются из командной строки. Если я удалил >&1 2>/dev/null из shell_exec и exec из приведенного выше кода, то же самое предупреждение выдается в случае, когда имена файлов не содержат символов CJK. Когда имена файлов содержат символы CJK, ничего не отображается, что идентично наличию >&1 2>/dev/null в вызовах shell_exec и exec.

Также было проведено некоторое сравнение с прямыми командами Linux, такими как cat, сили без символов Unicode CJK в именах файлов, PHP shell_exec() и exec() ведут себя корректно. Кажется, только когда java вызывается через shell_exec и exec-функции, возникает неверная интерпретация имен файлов! Это действительно озадачивает!

Вопрос: Как правильно ссылаться на имя файла Linux, содержащее символы Unicode CJK в функциях PHP shell_exec() и exec() при вызове Tika, таким образом, когда shell_exec и exec передаютКоманды оболочки для Linux, Linux и java могут правильно интерпретировать имя файла?

Цените любые подсказки, решения и указывайте правильные направления. Глубокие Луки.

...