Подтвердить что ты не робот

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
4b9b3361

Ответ 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
}