Есть ли команда Linux, чтобы узнать, является ли файл UTF-8?

14

.iniФайлы Joomla должны быть сохранены как UTF-8.

После редактирования я не уверен, являются ли файлы UTF-8 или нет.

Есть ли какая- fileнибудь команда Linux или несколько команд, которые бы указывали, является ли файл действительно UTF-8 или нет?

Эдвард
источник
4
Вы не можете сказать кодировку файла. Вы можете только сделать умное предположение. Вы можете в основном угадать правильно, но иногда догадки не удаются. fileпример программы, делающей умные догадки
Марко
1
@Marco: Однако можно проверить, действительно ли это UTF-8 или нет. Есть некоторые кодировки, которые могут ошибочно считаться действительными UTF-8, но это почти никогда не происходит с кодировками / кодировками ISO-8859-𝒏 или Windows-125𝒏.
user1686

Ответы:

28

Вы можете определить кодировку файла с помощью следующей команды:

file -bi filename
Rik
источник
3
@nicolas Для MacOS вы можете попробовать file -I filename(-Я столица я).
Рик
5
Это читает весь файл?
ctrl-alt-delor
2
У @ kojow7 utf-8 нет заголовка. Чистый ASCII (только 7-битный) неотличим от utf-8 (вот в чем смысл, заголовок будет вызывать всевозможные проблемы). Таким образом, если у вас есть файл, который является ASCII для первого МБ, то имеет один символ UTF-8, то вы не узнаете, если не прочитаете весь файл.
ctrl-alt-delor
3
Это не должно быть принято в качестве ответа. Команда file не делает этого; он читает только часть файла и использует магические числа, чтобы сделать правильное предположение. В некоторых случаях «файл» может и даст вам неправильный ответ. Чтобы проверить, проходит ли файл кодировку, такую ​​как ascii, iso-8859-1, utf-8 или что-то еще, хорошим решением будет использование команды 'iconv'.
Тим
1
Я проверил это, и это может и действительно терпит неудачу.
Тим
9

Есть, используйте isutf8команду из пакета moreutils .

Источник: Как вы можете определить, является ли файл в кодировке UTF-8 или нет?


Пабло Олмос де Агилера С.
источник
@ davidpostill Мне любопытно, плохая практика цитировать автора в ссылку?
Пабло Олмос де Агилера С.
Нет. Тем не менее, это хорошая практика, чтобы ссылка говорила, куда она меня ведет. Предположим, я читаю только синий текст. После редактирования я могу сказать, почему и когда я должен нажать на это. Раньше я не мог. (Это был не я, кто сделал редактирование, но я на 94% уверен, что это было то, о чем это было.)
Герман Деппс
Хорошо, и хорошо работает find -type f -exec isutf8 {} +, потому что он также цитирует имя файла. (И с использованием find ... -exec ... +тоже быстро)
Томаш Гандор
2

Не используйте fileкоманду. Он не проверяет весь файл и в основном догадывается. Иногда дает неправильные ответы.

Вы можете проверить, проходит ли файл кодировку UTF-8 следующим образом:

$ iconv -f utf8 <filename> -t utf8 -o /dev/null

Код возврата нуля означает, что он проходит UTF8. Ненулевой код возврата означает, что он недействителен UTF8.

Это не возможно знать , если файл был обязательно экспортировать с помощью какой - либо конкретной схемы кодирования, так как некоторые кодирующие схемы перекрываются. Для этого потребуется встроить метаданные в файл, и даже тогда вы будете доверять тому, кто сгенерировал этот файл, а не проверять его самостоятельно ... и вы всегда должны проверять его самостоятельно.

Тим
источник
0

Еще один способ - использовать recode, который завершится с ошибкой, если попытается декодировать UTF-8 и встретит недопустимые символы.

if recode utf8/..UCS < "$FILE" >/dev/null 2>&1; then
    echo "Valid utf8 : $FILE"
else
    echo "NOT valid utf8: $FILE"
fi
mivk
источник