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 
}