iconv任何编码为UTF-8

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

我正在使用这个脚本,但你必须指定你要从哪个编码。 我怎样才能使它自动检测当前的编码?

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 

terminal线

 sudo convert/dir_iconv.sh convert/books CURRENT_ENCODING utf8 

也许你正在寻找enca

恩卡是一个非常天真的字符集分析仪。 它检测文本文件的字符集和编码,还可以使用内置的转换器或外部库和工具(如libiconv,librecode或cstocs)将其转换为其他编码。

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

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

你可以使用标准的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 

编译所有这些。 转到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 $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 

这是我解决所有文件的解决方案:

 #!/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编码的解决方法。 许多不常见的编码需要像这样的解决方法。

在linux cli中查看可用于数据转换的工具: https : //www.debian.org/doc/manuals/debian-reference/ch11.en.html

此外,还有一个任务是找出一个可用iconv编码的完整列表。 只要运行iconv --list并找出编码名称与uchardet工具返回的名称不同(例如: uchardet x-mac- uchardeticonv mac- uchardet

enca命令不适用于使用GB2312编码的简体中文文本文件。

相反,我使用下面的函数来为我转换文本文件。 你当然可以将输出重定向到一个文件中。

它需要chardeticonv命令。

 detection_cat () { DET_OUT=$(chardet $1); ENC=$(echo $DET_OUT | sed "s|^.*: \(.*\) (confid.*$|\1|"); iconv -f $ENC $1 }