다음 코드 조각이 포함된 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"