Iconv любая кодировка для UTF-8
Я пытаюсь указать iconv в каталог, и все файлы будут преобразованы UTF-8 независимо от текущей кодировки
Я использую этот script, но вы должны указать, какую кодировку вы собираетесь ОТ. Как я могу заставить его автоматически определить текущую кодировку?
dir_iconv.sh
#!/bin/bash
ICONVBIN='/usr/bin/iconv' # path to iconv binary
if [ $# -lt 3 ]
then
echo "$0 dir from_charset to_charset"
exit
fi
for f in $1/*
do
if test -f $f
then
echo -e "\nConverting $f"
/bin/mv $f $f.old
$ICONVBIN -f $2 -t $3 $f.old > $f
else
echo -e "\nSkipping $f - not a regular file";
fi
done
терминальная линия
sudo convert/dir_iconv.sh convert/books CURRENT_ENCODING utf8
Ответы
Ответ 1
Возможно, вы ищете enca
:
Enca - это чрезвычайно наивный анализатор символов. Он обнаруживает набор символов и кодировку текстовых файлов и может также преобразовывать их в другие кодировки, используя либо встроенный конвертер, либо внешние библиотеки и инструменты, такие как libiconv, librecode или cstocs.
В настоящее время он поддерживает белорусский, болгарский, хорватский, чешский, эстонский, венгерский, латышский, литовский, польский, русский, словацкий, словенский, украинский, китайский и некоторые многобайтовые кодировки независимо от языка.
Обратите внимание, что в общем случае автоопределение текущей кодировки является сложным процессом (одна и та же последовательность байтов может быть правильным текстом в нескольких кодировках). enca
использует эвристику на основе языка, который вы скажете, чтобы определить (чтобы ограничить количество кодировок). Вы можете использовать enconv
для конвертировать текстовые файлы в одну кодировку.
Ответ 2
Вы можете получить то, что вам нужно, используя стандартный файл gnu utils и awk. Пример:
file -bi .xsession-errors
дает мне:
"text/plain, charset = us-ascii"
so file -bi .xsession-errors |awk -F "=" '{print $2}'
дает мне
"US-ASCII"
Я использую его в сценариях так:
CHARSET="$(file -bi "$i"|awk -F "=" '{print $2}')"
if [ "$CHARSET" != utf-8 ]; then
iconv -f "$CHARSET" -t utf8 "$i" -o outfile
fi
Ответ 3
Компилирование всех них. Перейдите в каталог 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 $2}')"
if [ "$CHARSET" != utf-8 ]; then
iconv -f "$CHARSET" -t utf8 "$f" -o "$f"
fi
else
echo -e "\nSkipping $f - it a regular file";
fi
done
Ответ 4
Вот мое решение для размещения всех файлов:
#!/bin/bash
apt-get -y install recode uchardet > /dev/null
find "$1" -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 здесь.
Многим необычным кодировкам нужны обходные пути, подобные этому.
Ответ 5
Посмотрите инструменты, доступные для преобразования данных в linux cli: https://www.debian.org/doc/manuals/debian-reference/ch11.en.html
Кроме того, есть поиск, чтобы узнать полный список кодировок, доступных в iconv
. Просто запустите iconv --list
и узнайте, что имена кодировок отличаются от имен, возвращаемых инструментом uchardet
(например: x-mac-cyrillic в uchardet
против mac-cyrillic в iconv
)
Ответ 6
Команда enca не работает для моего упрощенного китайского текстового файла с кодировкой GB2312.
Вместо этого я использую следующую функцию для преобразования текстового файла для меня.
Конечно, вы можете перенаправить вывод в файл.
Для этого требуются команды chardet и iconv.
detection_cat ()
{
DET_OUT=$(chardet $1);
ENC=$(echo $DET_OUT | sed "s|^.*: \(.*\) (confid.*$|\1|");
iconv -f $ENC $1
}