iconv любая кодировка в UTF-8
Я пытаюсь указать iconv в каталог, и все файлы будут преобразованы UTF-8 независимо от текущей кодировки
Я использую этот скрипт, но вы должны указать, из какой кодировки вы собираетесь. Как я могу сделать его autdetect текущей кодировки?
dir_iconv.sh
#!/bin/bash
ICONVBIN='/usr/bin/iconv' # path to iconv binary
if [ $# -lt 3 ]
then
echo " dir from_charset to_charset"
exit
fi
for f in /*
do
if test -f $f
then
echo -e "nConverting $f"
/bin/mv $f $f.old
$ICONVBIN -f -t $f.old > $f
else
echo -e "nSkipping $f - not a regular file";
fi
done
терминал строку
sudo convert/dir_iconv.sh convert/books CURRENT_ENCODING utf8
6 ответов
может быть, вы ищете enca
:
Enca-чрезвычайно наивный анализатор кодировок. Он обнаруживает набор символов и кодировку текстовых файлов, а также может конвертировать их в другие кодировки с помощью встроенного конвертера или внешних библиотек и инструментов, таких как libiconv, librecode или cstocs.
В настоящее время он поддерживает белорусский, болгарский, хорватский, чешский, эстонский, венгерский, латвийский, литовский, польский, русский, Словацкий, Словенский, Украинский, китайский и некоторые многобайтовые кодировки независимо от языка.
обратите внимание, что в целом автоопределение текущей кодировки является сложным процессом (одна и та же последовательность байтов может быть правильным текстом в нескольких кодировках). enca
использует эвристику на основе языка, который вы говорите ему обнаружить (ограничить количество кодировок). Вы можете использовать enconv
to преобразование текстовых файлов к одной кодировке.
вы можете получить то, что вам нужно, используя стандартный файл GNU utils и awk. Пример:
file -bi .xsession-errors
дать мне:
"text / plain; charset=us-ascii"
так file -bi .xsession-errors |awk -F "=" '{print }'
дать мне
"us-ascii"
Я использую его в таких сценариях:
CHARSET="$(file -bi "$i"|awk -F "=" '{print }')"
if [ "$CHARSET" != utf-8 ]; then
iconv -f "$CHARSET" -t utf8 "$i" -o outfile
fi
компиляция всех их. Перейти к dir, создать dir2utf8.sh :
#!/bin/bash
# converting all files in a dir to utf8
for f in *
do
if test -f $f then
echo -e "\nConverting $f"
CHARSET="$( file -bi "$f"|awk -F "=" '{print }')"
if [ "$CHARSET" != utf-8 ]; then
iconv -f "$CHARSET" -t utf8 "$f" -o "$f"
fi
else
echo -e "\nSkipping $f - it's a regular file";
fi
done
вот мое решение для размещения всех файлов:
#!/bin/bash
apt-get -y install recode uchardet > /dev/null
find "" -type f | while read FFN # 'dir' should be changed...
do
encoding=$(uchardet "$FFN")
echo "$FFN: $encoding"
enc=`echo $encoding | sed 's#^x-mac-#mac#'`
set +x
recode $enc..UTF-8 "$FFN"
done
https://gist.github.com/demofly/25f856a96c29b89baa32
положите его в convert-dir-to-utf8.sh
и
bash convert-dir-to-utf8.sh /pat/to/my/trash/dir
обратите внимание, что sed является обходным путем для Mac-кодировок здесь. Многие необычные кодировки нуждаются в обходных путях, подобных этому.
Проверьте инструменты, доступные для преобразования данных в Linux cli:https://www.debian.org/doc/manuals/debian-reference/ch11.en.html
кроме того, есть квест, чтобы выяснить полный список кодировок, которые доступны в iconv
. Просто запустите iconv --list
и узнайте, что имена кодировок отличаются от имен, возвращаемых uchardet
инструмент (например: x-mac-кириллица в uchardet
против Mac-кириллица в iconv
)
команда enca не работает для моего упрощенного китайского текстового файла с кодировкой GB2312.
вместо этого я использую следующую функцию для преобразования текстового файла для меня. Конечно, вы можете перенаправить вывод в файл.
требует chardet и iconv команды.
detection_cat ()
{
DET_OUT=$(chardet );
ENC=$(echo $DET_OUT | sed "s|^.*: \(.*\) (confid.*$||");
iconv -f $ENC
}