iconv任何编码为UTF-8

Bla*_*ner 19 linux ubuntu encoding utf-8 iconv

我试图将iconv指向一个目录,所有文件都将转换为UTF-8,无论当前编码如何

我正在使用此脚本,但您必须指定要进行的编码.如何让它自动检测当前编码?

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
Run Code Online (Sandbox Code Playgroud)

终点线

sudo convert/dir_iconv.sh convert/books CURRENT_ENCODING utf8
Run Code Online (Sandbox Code Playgroud)

Mic*_*man 18

也许您正在寻找enca:

Enca是一款非常天真的Charset分析仪.它可以检测文本文件的字符集和编码,还可以使用内置转换器或外部库以及libiconv,librecode或cstocs等工具将它们转换为其他编码.

目前它支持白俄罗斯语,保加利亚语,克罗地亚语,捷克语,爱沙尼亚语,匈牙利语,拉脱维亚语,立陶宛语,波兰语,俄语,斯洛伐克语,斯洛文尼亚语,乌克兰语,中文和一些独立于语言的多字节编码.

请注意,通常,当前编码的自动检测是一个困难的过程(相同的字节序列可以是多个编码中的正确文本).enca使用基于您告诉它检测的语言的启发式(以限制编码的数量).您可以使用enconv文本文件转换到一个单一的编码.


小智 10

您可以使用标准gnu utils文件和awk获得所需内容.例:

file -bi .xsession-errors 给了我:"text/plain; charset = us-ascii"

所以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
Run Code Online (Sandbox Code Playgroud)

  • 但是,`file`使用的启发式方法可能相当粗糙.小心. (3认同)

小智 6

编译所有这些.转到目录,创建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's a regular file";
    fi
done
Run Code Online (Sandbox Code Playgroud)


小智 5

这是使用recodeuchardet放置所有文件的解决方案

#!/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
Run Code Online (Sandbox Code Playgroud)

放入convert-dir-to-utf8.sh并运行:

bash convert-dir-to-utf8.sh /pat/to/my/trash/dir
Run Code Online (Sandbox Code Playgroud)

请注意,这里sed是 mac 编码的解决方法。许多不常见的编码需要这样的解决方法。