Мне нужно найти кодировку всех файлов, помещенных в каталог. Есть ли способ узнать используемую кодировку?
Команда file
не может этого сделать.
Меня интересует кодировка ISO 8859-1. Если кодировка другая, я хочу переместить файл в другой каталог.
Мне нужно найти кодировку всех файлов, помещенных в каталог. Есть ли способ узнать используемую кодировку?
Команда file
не может этого сделать.
Меня интересует кодировка ISO 8859-1. Если кодировка другая, я хочу переместить файл в другой каталог.
Похоже, вы ищете enca
. Он может угадывать и даже конвертировать между кодировками. Просто посмотрите справочную страницу.
В противном случае используйте file -i
(Linux) или file -I
(OS X). Это выведет информацию о типе MIME для файла, которая также будет включать кодировку набора символов. Я тоже нашел для него справочную страницу :)
enca --list languages
показывает в основном русскую и восточноевропейскую (плюс несколько китайских) кодировок. Ну что ж! Тогда снова в Google.
- person GuruM; 19.06.2012
enca
кажется совершенно бесполезным для анализа файла, написанного на английском языке, но если вы случайно посмотрите что-то на эстонском, это может решить все ваши проблемы. Очень полезный инструмент, который ... ‹/sarcasm›
- person cbmanica; 17.04.2013
file -b --mime-encoding YOURFILE
только для печати кодировки
- person Ivan Chau; 04.09.2013
if file --brief --mime-encoding YOURFILE | grep -q "utf-8"; then echo "I am utf-8 encoded"; else echo "I am different"; fi
Спасибо @IvanChau
- person Petr Újezdský; 30.07.2015
file -i
показывает us-ascii
- person vladkras; 21.11.2016
'abc'
внутри, он показывает myfile.txt: text/plain; charset=us-ascii
- person vladkras; 02.03.2017
a
, b
и c
- все символы ascii, и их представление utf-8 такое же, как ascii. Если вам интересно, прочтите, как работает кодировка utf-8.
- person vadipp; 02.03.2017
no
в вашем комментарии, в любом случае phpstorm обнаруживает эти файлы, такие как не-utf8, а file -i
показывает ascii
- person vladkras; 03.03.2017
file -bi <file name>
Если вы хотите сделать это для группы файлов
for f in `find | egrep -v Eliminate`; do echo "$f" ' -- ' `file -bi "$f"` ; done
Do not prepend filenames to output lines
- person craq; 12.01.2016
file -b --mime-encoding
выводит только кодировку кодировки
- person jesjimher; 18.04.2018
uchardet - библиотека детектора кодирования, перенесенная из Mozilla.
Использование:
~> uchardet file.java
UTF-8
Различные дистрибутивы Linux (Debian, Ubuntu, openSUSE, Pacman и т. д.) предоставляют двоичные файлы.
sudo apt-get install uchardet
это настолько просто, что я решил не беспокоиться об этом ...
- person sage; 10.03.2016
uchardet
имеет большое преимущество перед file
и enca
в том, что он анализирует весь файл (только что попробовал с файлом 20 ГБ), а не только начало.
- person tuxayo; 20.01.2020
Вот пример сценария с использованием file -I
и iconv, который работает в Mac OS X.
Для вашего вопроса вам необходимо использовать 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
file -b --mime-encoding
выводит только кодировку, поэтому вы можете избежать обработки конвейера
- person jesjimher; 18.04.2018
В Debian вы также можете использовать: encguess
:
$ encguess test.txt
test.txt US-ASCII
uchardet
в Ubuntu, и он сказал мне, что мой файл был WINDOWS-1252
. Я знаю, что это было неправильно, потому что я сохранил его как UTF-16 с Кейт, чтобы проверить. Однако encguess
угадайте правильно, и он был предустановлен в Ubuntu 19.04.
- person Nagev; 11.06.2019
/usr/bin/encguess
- person NetVicious; 18.06.2021
Чтобы преобразовать кодировку из ISO 8859-1 в ASCII:
iconv -f ISO_8859-1 -t ASCII filename.txt
Действительно сложно определить, соответствует ли это ISO 8859-1. Если у вас есть текст, состоящий только из 7-битных символов, это также может быть ISO 8859-1, но вы не знаете. Если у вас есть 8-битные символы, тогда символы верхнего региона также существуют в порядковых кодировках. Поэтому вам придется использовать словарь, чтобы лучше угадать, какое это слово, и определить оттуда, какая буква это должна быть. Наконец, если вы обнаружите, что это может быть UTF-8, вы уверены, что это не ISO 8859-1.
Кодирование - одна из самых сложных задач, потому что никогда не знаешь, что тебе ничего не говорит.
В Python вы можете использовать модуль chardet.
Это не то, что вы можете сделать надежным способом. Одна из возможностей - проверить каждый символ в файле, чтобы убедиться, что он не содержит никаких символов в диапазонах 0x00 - 0x1f
или 0x7f -0x9f
, но, как я уже сказал, это может быть верно для любого количества файлов, включая хотя бы один другой вариант ISO 8859.
Другая возможность - поискать определенные слова в файле на всех поддерживаемых языках и посмотреть, сможете ли вы их найти.
Так, например, найдите эквивалент английского и, но, to, of и т. Д. На всех поддерживаемых языках ISO 8859-1 и посмотрите, есть ли у них большое количество вхождений в файле.
Я не говорю о дословном переводе, например:
English French
------- ------
of de, du
and et
the le, la, les
хотя это возможно. Я говорю об общих словах в целевом языке (насколько я знаю, в исландском нет слова для и - вам, вероятно, придется использовать их слово для обозначения рыбы [извините, это немного стереотипно. Я не имел в виду никакого оскорбления, просто иллюстрирую точку]).
Я знаю, что вас интересует более общий ответ, но то, что хорошо в 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
Если вы говорите о файлах XML (ISO-8859-1), объявление XML внутри них указывает кодировку: <?xml version="1.0" encoding="ISO-8859-1" ?>
Итак, вы можете использовать регулярные выражения (например, с Perl) для проверки каждого файла на наличие такой спецификации.
Дополнительную информацию можно найти здесь: Как определить кодировку текстового файла.
В 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
Я использую следующий сценарий, чтобы
#!/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 {} \;
С помощью этой команды:
for f in `find .`; do echo `file -i "$f"`; done
вы можете перечислить все файлы в каталоге и подкаталогах и в соответствующей кодировке.
Если в имени файла есть пробел, используйте:
IFS=$'\n'
for f in `find .`; do echo `file -i "$f"`; done
Помните, что это изменит ваш текущий интерпретатор сеанса Bash для пробелов.
IFS=$'\n'
перед использованием скрипта: askubuntu.com/a/344418/734218
- person danilo; 06.03.2021
Вы можете извлечь кодировку одного файла с помощью команды file. У меня есть файл sample.html с:
$ file sample.html
sample.html: HTML-документ, текст Unicode UTF-8 с очень длинными строками.
$ file -b sample.html
Документ HTML, текст Unicode UTF-8 с очень длинными строками
$ file -bi sample.html
текст / html; charset = utf-8
$ file -bi sample.html | awk -F'=' '{print $2 }'
utf-8
В 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 для преобразования всего в UTF-8 из любая исходная кодировка, поддерживаемая 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
В Perl используйте Encode :: Detect.
apropos encoding
. Он ищет заголовки и описания всех страниц руководства. Когда я делаю это на своей машине, я вижу 3 инструмента, которые могут мне помочь, судя по их описаниям:chardet
,chardet3
,chardetect3
. Затем, выполнивman chardet
и прочитав справочную страницу, я узнаю, чтоchardet
- это как раз та утилита, которая мне нужна. - person John Red   schedule 18.05.2016us-ascii
, но после добавления строки китайского комментария оно становитсяutf-8
.file
может определить кодировку, прочитав содержимое файла и угадав. - person user218867   schedule 03.09.2016