ฉันใช้สคริปต์ทุบตีด้านล่างมันใช้งานได้สำหรับฉัน
มันพยายามครั้งแรกที่จะiconv
ได้จากการเข้ารหัสที่ส่งกลับโดยการfile --mime-encoding
utf-8
หากไม่สำเร็จจะผ่านการเข้ารหัสทั้งหมดและแสดงความแตกต่างระหว่างไฟล์ต้นฉบับและไฟล์ที่เข้ารหัสใหม่ มันข้ามการเข้ารหัสที่สร้างเอาท์พุท diff ขนาดใหญ่ ("ใหญ่" ตามที่กำหนดโดยMAX_DIFF_LINES
ตัวแปรหรืออาร์กิวเมนต์อินพุตที่สอง) เนื่องจากสิ่งเหล่านั้นมีแนวโน้มที่จะเข้ารหัสผิด
หาก "สิ่งเลวร้าย" เกิดขึ้นจากการใช้สคริปต์นี้อย่าโทษฉัน มีrm -f
อยู่ในนั้นดังนั้นจึงมีสัตว์ประหลาด ฉันพยายามป้องกันผลข้างเคียงจากการใช้ไฟล์ที่มีคำต่อท้ายแบบสุ่ม แต่ฉันไม่ได้สัญญาใด ๆ
ทดสอบกับดาร์วิน 15.6.0
#!/bin/bash
if [[ $# -lt 1 ]]
then
echo "ERROR: need one input argument: file of which the enconding is to be detected."
exit 3
fi
if [ ! -e "$1" ]
then
echo "ERROR: cannot find file '$1'"
exit 3
fi
if [[ $# -ge 2 ]]
then
MAX_DIFF_LINES=$2
else
MAX_DIFF_LINES=10
fi
#try the easy way
ENCOD=$(file --mime-encoding $1 | awk '{print $2}')
#check if this enconding is valid
iconv -f $ENCOD -t utf-8 $1 &> /dev/null
if [ $? -eq 0 ]
then
echo $ENCOD
exit 0
fi
#hard way, need the user to visually check the difference between the original and re-encoded files
for i in $(iconv -l | awk '{print $1}')
do
SINK=$1.$i.$RANDOM
iconv -f $i -t utf-8 $1 2> /dev/null > $SINK
if [ $? -eq 0 ]
then
DIFF=$(diff $1 $SINK)
if [ ! -z "$DIFF" ] && [ $(echo "$DIFF" | wc -l) -le $MAX_DIFF_LINES ]
then
echo "===== $i ====="
echo "$DIFF"
echo "Does that make sense [N/y]"
read $ANSWER
if [ "$ANSWER" == "y" ] || [ "$ANSWER" == "Y" ]
then
echo $i
exit 0
fi
fi
fi
#clean up re-encoded file
rm -f $SINK
done
echo "None of the encondings worked. You're stuck."
exit 3