我正在编写一个包含以下代码片段的 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"