Короче говоря, я решил решить мою проблему с помощью "file -bi" и "iconv -f ISO-8859-1 -t UTF-8".
Недавно я столкнулся с подобной проблемой, пытаясь нормализовать кодировку имен файлов. У меня была смесь ISO-8859-1, UTF-8 и ASCII. Поняв, что при обработке файлов я добавил сложности, вызванные тем, что имя каталога имеет одну кодировку, которая отличается от кодировки файла.
Первоначально я пытался использовать Perl, но он не мог правильно различить UTF-8 и ISO-8859-1, что привело к искажению UTF-8.
В моем случае это было однократное преобразование при разумном количестве файлов, поэтому я выбрал медленный метод, о котором я знал, и который работал без ошибок (в основном потому, что использовалось только 1-2 несмежных символа в строке). специальные коды ISO-8859-1)
Опция # 1 преобразует ISO-8859-1 в UTF-8
cat mixed_text.txt |
while read i do
type=${"$(echo "$i" | file -bi -)"#*=}
if [[ $type == 'iso-8859-1' ]]; then
echo "$i" | iconv -f ISO-8859-1 -t UTF-8
else
echo "$i"
fi
done > utf8_text.txt
Опция №2 преобразуется в ISO-8859-1 в ASCII
cat mixed_text.txt |
while read i do
type=${"$(echo "$i" | file -bi -)"#*=}
if [[ $type == 'iso-8859-1' ]]; then
echo "$i" | iconv -f ISO-8859-1 -t ASCII//TRANSLIT
else
echo "$i"
fi
done > utf8_text.txt