次のコードスニペットを含む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
pdfencrypt
8ビット(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
同じ問題に直面するでしょう。pdfencrypt
8ビット文字に会うと、まだ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"