Сценарий Bash с использованием pdfencrypt не работает для определенных символов

Я пишу сценарий bash со следующим фрагментом:

#!/bin/bash # usage '$bash this-script.sh in.pdf out.pdf' stty -echo printf "Password: " read password stty echo echo pdfencrypt "$1" -p "$password" -o "$2" 

на таких символах, как § ä ö ü он выходит из строя со следующим сообщением:

несовместимые кодировки символов: UTF-8 и ASCII-8BIT

Я сталкиваюсь с ошибкой pdfencrypt или неправильно кодируется пример?
Если я использую echo "$password" все идет хорошо.

  • Что такое чистый шрифт sans, поддерживающий UTF-8, который подходит для использования в консоли?
  • Charset / font в консоли Linux
  • Можно ли отображать математические символы в терминале?
  • Изменение шрифтов в приложении терминала Mate
  • Сколько байтов может вернуться к нажатию клавиши? И должен ли метафорический ключ вернуться больше?
  • Как я могу правильно распаковать ZIP-архив файлов с ивритскими именами?
  • Как я могу сделать графические символы для вывода на экран терминала Debian 8?
  • Какой хороший текстовый редактор с поддержкой RTL (справа налево)?
  • One Solution collect form web for “Сценарий Bash с использованием pdfencrypt не работает для определенных символов”

    Похоже, что pdfencrypt требует 8- pdfencrypt (ISO-8859) закодированного пароля и не знает, как обрабатывать (то есть конвертировать) пароли UTF-8.

    Вы должны использовать совместимую кодировку символов при выполнении pdfencrypt для шифрования и дешифрования. Обычная ASCII («C») или ISO-8859-n (например, «de_DE.latin1», как предложено Hauke ​​Laging) должна работать. На мой взгляд, это просто инструктирует pdfencrypt принимать символы вашего пароля как есть (т. pdfencrypt Не требуется преобразование), вот и все.

    Просто добавьте эту строку вверху вашего скрипта:

     export LC_ALL=de_DE.latin1 # Or fr_FR, or latin15, or... Any valid locale for your system 

    Или изменить эту единственную строку может быть достаточно:

     LC_ALL=de_DE.latin1 pdfencrypt "$1" -p "$password" -o "$2" 

    Сделайте то же самое для декодирования.

    Если вы конвертируете свой пароль с помощью iconv вместо установки LC_ALL, я думаю, у вас будет такая же проблема, поскольку pdfencrypt прежнему полагает, что вы даете ему символы UTF-8, когда он встречает 8-битные.

    Во всяком случае, чтобы все было проще, вы, вероятно, должны придерживаться 7-битного набора символов ASCII: пробел, буквы без акцента, цифры, основные знаки пунктуации и т. Д. ( man 7 ascii )

    Что касается пространства, вы должны знать, что чтение в определенную переменную с ( read -r var ) удаляет начальные и конечные пробелы (на самом деле символы в переменной оболочки IFS ). Это может раздражать пароль. Вы должны использовать read -r который переводит всю строку в переменную REPLY .

    Это даст код:

     export LC_ALL=de_DE.latin1 read -r -s -p "Password: " echo pdfencrypt "$1" -p "$REPLY" -o "$2" 
    Linux и Unix - лучшая ОС в мире.