使用 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

似乎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"

对解码执行相同的操作。

如果你转换你的密码而iconv不是设置 LC_ALL,我想你会遇到同样的问题,因为pdfencrypt当它遇到 8 位字符时,你仍然相信你给它的是 UTF-8 字符。

不管怎样,为了让事情变得更简单,你可能应该坚持使用 7 位 ASCII 字符集:空格、非重音字母、数字、基本标点符号等。( man 7 ascii)

至于空格,您应该注意,用 ( read -r var) 读取特定变量会删除前导空格和尾随空格(实际上是 shell 变量 中的字符IFS)。对于密码来说这可能很烦人。您应该使用read -r它将整行读取到REPLY变量中。

这将给出该代码:

export LC_ALL=de_DE.latin1
read -r -s -p "Password: "
echo
pdfencrypt "$1" -p "$REPLY" -o "$2"

相关内容