Команда File не определена на 100%. Простой тест:
#!/bin/bash
echo "a" > /tmp/foo
for i in {1..1000000}
do
echo "asdas" >> /tmp/foo
done
echo "üöäÄÜÖß " >> /tmp/foo
file -b --mime-encoding /tmp/foo
это выводит:
us-ascii
Асия не знает немецких умлаутов.
Файл представляет собой набор байтов (последовательность байтов). Без доверия к метаданным (спецификация только для utf-16 и utf-32, MIME, заголовок данных) вы не сможете обнаружить кодировку. Последовательность байтов может быть интерпретирована как utf-8 или ISO-8859-1 / 2 или как угодно. Ну, это зависит от определенной последовательности, если карта iso-8850-1 / utf-8 существует. То, что вы хотите, это закодировать все содержимое файла в нужную кодировку символов. В случае неудачи желаемое кодирование не имеет карты для этой последовательности байтов.
В оболочке возможно использовать python, perl или как говорит Лоуренс Гонсалвес iconv. Для текстовых файлов я использую в Python это:
f = codecs.open(path, encoding='utf-8', errors='strict')
def valid_string(str):
try:
str.decode('utf-8')
return True
except UnicodeDecodeError:
return False
Как вы считаете, что файл представляет собой текстовый файл. Вы не Вы кодируете построчно с желаемой кодировкой символов. Хорошо, вы можете добавить немного доверия и проверить, существует ли спецификация (файл имеет кодировку utf).