Проблемы с использованием расширенных символов ascii в качестве параметров в linux CL - PullRequest
0 голосов
/ 24 февраля 2020

Я пытаюсь передать некоторые строки в качестве аргументов в файл .jar, который выполняю с помощью командной строки в linux debian. Часть строк - это расширенные символы, такие как символ авторского права или буква ü.

java -jar someJar_CL.jar arg1 arg2 'Lizenziert für foo © foobar' 

При windows при использовании PowerShell все работает просто отлично. Файл .jar выполняется должным образом. Тем не менее, в linux я получаю следующее исключение:

java.lang.IllegalArgumentException: U+FFFD ('.notdef') is not available in this font Helvetica encoding: WinAnsiEncoding
        at org.apache.pdfbox.pdmodel.font.PDType1Font.encode(PDType1Font.java:426)
        at org.apache.pdfbox.pdmodel.font.PDFont.encode(PDFont.java:342)
        at org.apache.pdfbox.pdmodel.font.PDFont.getStringWidth(PDFont.java:373)
        at watermark.app.AddWatermarkToFile.watermarkPdf(AddWatermarkToFile.java:101)
        at watermark.app.AddWatermarkToFile.watermarkPdfs(AddWatermarkToFile.java:51)
        at watermark.gui.BatchWatermarkPDFFile.main(BatchWatermarkPDFFile.java:113)

В моем понимании, это исключение означает, что в программе есть проблемы с расширенными символами ascii. Если я удаляю их, он выполняется правильно (в linux).

У меня нет прямого доступа к исходному коду файла .jar, но я не думаю, что это необходимо, поскольку он выполняется правильно в windows (все зависит от ОС).

Я не думал, что это будет решением, но я установил шрифты ms с apt-get install msttcorefonts. Это ничего не изменило.

Как я могу исправить эту проблему? Это как-то связано со шрифтом Helvetica? Будет ли он работать с другим шрифтом в linux? Я могу связаться с разработчиком .jar и попросить внести изменения, но только если это действительно необходимо.

Заранее спасибо.

1 Ответ

1 голос
/ 25 февраля 2020

Поскольку PdfBox жалуется на U + FFFD (символ замены Unicode), мы можем с уверенностью сказать, что что-то пошло не так, прежде чем строка была передана в библиотеку PdfBox.

Кажется, проблема в том, как Java интерпретирует байты, поступающие через командную строку (параметры). На Linux он будет использовать информацию о локали, чтобы выяснить, как интерпретировать параметры командной строки (которые ОС просто предоставляет как строки аннотированных байтов без указания их кодировки).

Если вы не используете Если у вас не настроен языковой стандарт, он может вернуться к языковому стандарту POSIX и использовать кодировку ASCII. Вы можете исправить это одним из двух способов:

  1. настроить вашу локаль (наиболее непосредственно переменную среды LANG) на локаль, которая использует кодировку UTF-8.

    Вы можете сделать это глобально или просто для одного вызова java.

  2. установить системное свойство sun.jnu.encoding, чтобы явно указать Java как для декодирования аргументов командной строки.

    Эта опция плохо документирована и не стандартизирована, поэтому она может не работать с виртуальными машинами, отличными от Oracle.

...