ОС: 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 могут правильно интерпретировать имя файла?
Цените любые подсказки, решения и указывайте правильные направления. Глубокие Луки.