আমি নীচে বাশ স্ক্রিপ্টটি প্রয়োগ করেছি, এটি আমার পক্ষে কাজ করে।
এটা তোলে প্রথম চেষ্টা iconv
এনকোডিং থেকে ফিরিয়ে দেওয়া file --mime-encoding
থেকে utf-8
।
যদি এটি ব্যর্থ হয় তবে এটি সমস্ত এনকোডিংয়ের মধ্য দিয়ে যায় এবং মূল এবং পুনরায় এনকোডযুক্ত ফাইলের মধ্যে পার্থক্য দেখায়। এটি এনকোডিংগুলিতে এড়িয়ে যায় যা একটি বড় ডিফ আউটপুট তৈরি করে ("বৃহত" 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