pdfcrypt を使用する Bash スクリプトが特定の文字で失敗します。

pdfcrypt を使用する Bash スクリプトが特定の文字で失敗します。

次のコードスニペットを含む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"うまくいきます。

ベストアンサー1

pdfencrypt8ビット(ISO-8859)でエンコードされたパスワードが必要なようですが、UTF-8パスワードを処理(つまり変換)する方法がわかりません。

pdfencrypt実行時に暗号化に互換性のある文字エンコーディングを使用する必要があります。そして解読します。一般的なASCII(「C」)またはISO-8859-n(Hauke Lagingによって提案された「de_DE.latin1」など)が機能する必要があります。これは、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"

デコードにも同じことを行います。

LC_ALLを設定する代わりにパスワードを変換すると、iconv同じ問題に直面するでしょう。pdfencrypt8ビット文字に会うと、まだUTF-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"

おすすめ記事