Как найти кодировку файла в Unix через скрипт (ы) - PullRequest
249 голосов
/ 30 апреля 2009

Мне нужно найти кодировку всех файлов, которые находятся в каталоге. Есть ли способ найти используемую кодировку?

Команда file не может этого сделать.

Кодировка, которая представляет для меня интерес: ISO-8859-1. Если кодировка - что-то еще, я хочу переместить файл в другой каталог.

Ответы [ 15 ]

353 голосов
/ 30 апреля 2009

Похоже, вы ищете enca. Он может угадывать и даже конвертировать между кодировками. Просто посмотрите на справочную страницу .

Или, если это не удалось, используйте file -i (linux) или file -I (osx). Это выведет информацию MIME-типа для файла, которая также будет включать кодировку набора символов. Я нашел для нее man-страницу :)

69 голосов
/ 27 июля 2012
file -bi <file name>

Если вы хотите сделать это для нескольких файлов

for f in `find | egrep -v Eliminate`; do echo "$f" ' -- ' `file -bi "$f"` ; done
28 голосов
/ 29 декабря 2015

uchardet - Библиотека детекторов кодирования, портированная из Mozilla.

Использование:

~> uchardet file.java 
UTF-8

Различные дистрибутивы Linux (Debian / Ubuntu, OpenSuse-packman, ...) предоставляют двоичные файлы.

9 голосов
/ 08 февраля 2016

вот пример сценария с использованием файлов -I и iconv, который работает на MacOsX Для вашего вопроса вам нужно использовать mv вместо iconv

#!/bin/bash
# 2016-02-08
# check encoding and convert files
for f in *.java
do
  encoding=`file -I $f | cut -f 2 -d";" | cut -f 2 -d=`
  case $encoding in
    iso-8859-1)
    iconv -f iso8859-1 -t utf-8 $f > $f.utf8
    mv $f.utf8 $f
    ;;
  esac
done
5 голосов
/ 30 апреля 2009

Действительно трудно определить, является ли это iso-8859-1. Если у вас есть текст только с 7-битными символами, который также может быть iso-8859-1, но вы не знаете. Если у вас есть 8-битные символы, то верхние символы региона также существуют в кодировках. Поэтому вам придется использовать словарь, чтобы лучше угадать, какое это слово и определить, от какой буквы это должно быть. Наконец, если вы обнаружите, что это может быть utf-8, чем вы уверены, что это не iso-8859-1

Кодирование - одна из самых сложных вещей, потому что вы никогда не знаете, ничего не говорит вам

3 голосов
/ 21 февраля 2018

В Debian вы также можете использовать: encguess:

$ encguess test.txt
test.txt  US-ASCII
3 голосов
/ 18 июля 2011

С Python вы можете использовать модуль chardet: https://github.com/chardet/chardet

2 голосов
/ 18 февраля 2019

Для преобразования кодировки из 8859 в ASCII:

iconv -f ISO_8859-1 -t ASCII filename.txt
2 голосов
/ 27 января 2012

Если вы говорите о XML-файлах (ISO-8859-1), то в XML-декларации внутри них указывается кодировка: <?xml version="1.0" encoding="ISO-8859-1" ?>
Таким образом, вы можете использовать регулярные выражения (например, с perl) для проверки каждого файла на наличие такой спецификации.
Дополнительную информацию можно найти здесь: Как определить кодировку текстового файла .

2 голосов
/ 30 апреля 2009

Это не то, что вы можете сделать безошибочно. Одной из возможностей может быть проверка каждого символа в файле, чтобы убедиться, что он не содержит символов в диапазонах 0x00 - 0x1f или 0x7f -0x9f, но, как я уже сказал, это может быть верно для любого количества файлов, включая, по крайней мере, еще один вариант ISO8859.

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

Так, например, найдите эквивалент английского «и», «но», «к», «of» и т. Д. На всех поддерживаемых языках 8859-1 и посмотрите, имеют ли они большое количество вхождения в файле.

Я не говорю о буквальном переводе, таком как:

English   French
-------   ------
of        de, du
and       et
the       le, la, les

хотя это возможно. Я говорю об общих словах на целевом языке (насколько я знаю, в исландском языке нет слова "и" - вам, вероятно, придется использовать их слово для "рыбы" [извините, это немного стереотипно, я не имею в виду любое оскорбление, просто иллюстрирующее точку зрения)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...