Как найти кодировку файла через скрипт в Linux?
Мне нужно найти кодировку всех файлов, которые помещаются в каталог. Есть ли способ найти используемую кодировку?
Команда file
не может этого сделать.
Кодировка, которая меня интересует, - это ISO-8859-1. Если кодировка - это что-то еще, я хочу переместить файл в другой каталог.
Ответы
Ответ 1
Похоже, вы ищете enca
. Он может догадываться и даже конвертировать между кодировками. Просто просмотрите страницу .
Или, если это не так, используйте file -i
(linux) или file -i
(osx). Это приведет к выдаче информации типа MIME для файла, которая также будет содержать кодировку с символьным набором. Я нашел man-page:)
Ответ 2
file -bi <file name>
Если вам нравится делать это для кучи файлов
for f in `find | egrep -v Eliminate`; do echo "$f" ' -- ' `file -bi "$f"` ; done
Ответ 3
uchardet - Библиотека детекторов кодирования, перенесенная из Mozilla.
Использование:
~> uchardet file.java
UTF-8
Различные дистрибутивы Linux (Debian/Ubuntu, OpenSuse-packman,...) предоставляют двоичные файлы.
Ответ 4
вот пример script с использованием файла -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
Очень сложно определить, является ли это iso-8859-1. Если у вас есть текст с 7-битными символами, которые также могут быть iso-8859-1, но вы не знаете. Если у вас есть 8-битные символы, то символы верхнего региона существуют и в кодировках. Поэтому вам нужно будет использовать словарь, чтобы лучше понять, какое это слово, и определить оттуда, какое письмо оно должно быть. Наконец, если вы обнаружите, что это может быть utf-8, чем вы уверены, что это не iso-8859-1
Кодирование - одна из самых сложных вещей, потому что вы никогда не знаете, ничего не говорится вам.
Ответ 6
С Python вы можете использовать модуль chardet: https://github.com/chardet/chardet
Ответ 7
В Debian вы также можете использовать: encguess
:
$ encguess test.txt
test.txt US-ASCII
Ответ 8
Чтобы преобразовать кодировку из 8859 в ASCII:
iconv -f ISO_8859-1 -t ASCII filename.txt
Ответ 9
Это не то, что вы можете сделать в надежном виде. Одна из возможностей - проверить каждый символ в файле, чтобы убедиться, что он не содержит символов в диапазонах 0x00 - 0x1f
или 0x7f -0x9f
, но, как я уже сказал, это может быть верно для любого количества файлов, в том числе по крайней мере еще один вариант ISO8859.
Другая возможность - искать определенные слова в файле на всех поддерживаемых языках и видеть, можете ли вы их найти.
Так, например, найдите эквивалент английских слов "и", "но", "to", "of" и т.д. на всех поддерживаемых языках 8859-1 и посмотрите, есть ли у них большое количество вхождения в файл.
Я не говорю о буквальном переводе, например:
English French
------- ------
of de, du
and et
the le, la, les
хотя это возможно. Я говорю об общих словах на целевом языке (все, что я знаю, у исландцев нет слова для "и" - вам, вероятно, придется использовать свое слово для "рыбы" [извините, что немного стереотипно, я не означает любое нарушение, просто иллюстрируя точку]).
Ответ 10
Если вы говорите об XML файлах (ISO-8859-1), декларация XML внутри них определяет кодировку: <?xml version="1.0" encoding="ISO-8859-1" ?>
Таким образом, вы можете использовать регулярные выражения (например, с perl
) для проверки каждого файла для такой спецификации.
Более подробную информацию можно найти здесь: Как определить кодировку текстового файла.
Ответ 11
Я знаю, что вас интересует более общий ответ, но что хорошего в ASCII, как правило, хорошо в других кодировках. Вот однострочный Python, чтобы определить, является ли стандартный ввод ASCII. (Я уверен, что это работает в Python 2, но я тестировал его только на Python 3.)
python -c 'from sys import exit,stdin;exit()if 128>max(c for l in open(stdin.fileno(),"b") for c in l) else exit("Not ASCII")' < myfile.txt
Ответ 12
В Cygwin это выглядит так, как будто это работает для меня:
find -type f -name "<FILENAME_GLOB>" | while read <VAR>; do (file -i "$<VAR>"); done
Пример:
find -type f -name "*.txt" | while read file; do (file -i "$file"); done
Вы можете передать это awk и создать команду iconv для преобразования всего в utf8 из любой исходной кодировки, поддерживаемой iconv.
Пример:
find -type f -name "*.txt" | while read file; do (file -i "$file"); done | awk -F[:=] '{print "iconv -f "$3" -t utf8 \""$1"\" > \""$1"_utf8\""}' | bash
Ответ 13
Вы можете извлечь кодировку одного файла с помощью команды file. У меня есть файл sample.html с:
$ file sample.html
sample.html: документ HTML, текст в кодировке UTF-8 Unicode с очень длинными строками
$ file -b sample.html
HTML-документ, текст в кодировке UTF-8 Unicode, с очень длинными строками
$ file -bi sample.html
текст /html; кодировка = UTF-8
$ file -bi sample.html | awk -F'=' '{print $2 }'
UTF-8
Ответ 14
Я использую следующий скрипт для
- Найти все файлы, которые соответствуют FILTER с SRC_ENCODING
- Создать резервную копию из них
- Преобразовать их в DST_ENCODING
- (необязательно) Удалить резервные копии
,
#!/bin/bash -xe
SRC_ENCODING="iso-8859-1"
DST_ENCODING="utf-8"
FILTER="*.java"
echo "Find all files that match the encoding $SRC_ENCODING and filter $FILTER"
FOUND_FILES=$(find . -iname "$FILTER" -exec file -i {} \; | grep "$SRC_ENCODING" | grep -Eo '^.*\.java')
for FILE in $FOUND_FILES ; do
ORIGINAL_FILE="$FILE.$SRC_ENCODING.bkp"
echo "Backup original file to $ORIGINAL_FILE"
mv "$FILE" "$ORIGINAL_FILE"
echo "converting $FILE from $SRC_ENCODING to $DST_ENCODING"
iconv -f "$SRC_ENCODING" -t "$DST_ENCODING" "$ORIGINAL_FILE" -o "$FILE"
done
echo "Deleting backups"
find . -iname "*.$SRC_ENCODING.bkp" -exec rm {} \;
Ответ 15
В PHP вы можете проверить, как показано ниже:
Указание списка кодировки явно:
php -r "echo 'probably : ' . mb_detect_encoding(file_get_contents('myfile.txt'), 'UTF-8, ASCII, JIS, EUC-JP, SJIS, iso-8859-1') . PHP_EOL;"
Более точные "mb_list_encodings":
php -r "echo 'probably : ' . mb_detect_encoding(file_get_contents('myfile.txt'), mb_list_encodings()) . PHP_EOL;"
Здесь, в первом примере, вы можете видеть, что я поместил список кодировок (определите порядок списков), которые могут совпадать. Чтобы получить более точный результат, вы можете использовать все возможные кодировки с помощью: mb_list_encodings()
Обратите внимание, что функции mb_ * требуют php-mbstring
apt-get install php-mbstring
Ответ 16
с помощью этой команды:
for f in 'find .'; do echo 'file -i "$f"'; done
вы можете перечислить все файлы в каталоге и подкаталогах и соответствующую кодировку.
Ответ 17
С Perl используйте Encode:: Detect.