Linux iconv将任何编码转换为UTF-8

Linux iconv将任何编码转换为UTF-8,linux,ubuntu,encoding,utf-8,iconv,Linux,Ubuntu,Encoding,Utf 8,Iconv,我试图将iconv指向一个目录,所有文件都将被转换为UTF-8,而不管当前的编码是什么 我正在使用这个脚本,但您必须指定要使用的编码。如何使其检测当前编码 dir_iconv.sh #/bin/bash ICONVBIN='/usr/bin/iconv'#到iconv二进制文件的路径 如果[$#-lt 3] 然后 echo“$0 dir从\u字符集到\u字符集” 出口 fi 一美元换f/* 做 如果测试-f$f 然后 echo-e“\n转换$f” /bin/mv$f$f.old $ICONVBI

我试图将iconv指向一个目录,所有文件都将被转换为UTF-8,而不管当前的编码是什么

我正在使用这个脚本,但您必须指定要使用的编码。如何使其检测当前编码

dir_iconv.sh

#/bin/bash
ICONVBIN='/usr/bin/iconv'#到iconv二进制文件的路径
如果[$#-lt 3]
然后
echo“$0 dir从\u字符集到\u字符集”
出口
fi
一美元换f/*
做
如果测试-f$f
然后
echo-e“\n转换$f”
/bin/mv$f$f.old
$ICONVBIN-f$2-t$3$f.old>$f
其他的
echo-e“\n跳过$f-不是常规文件”;
fi
完成
终端线

sudo convert/dir_iconv.sh convert/books CURRENT_ENCODING utf8
也许你正在寻找:

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

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


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

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

文件-bi.xsession错误
给我: “文本/普通;字符集=美国ascii”

因此
file-bi.xsession错误| awk-F“=”{print$2}'
给我 “美国ascii码”

我在脚本中使用它,如下所示:

CHARSET=“$(file-bi“$i”| awk-F”=“{print$2}”)
如果[“$CHARSET”!=utf-8];然后
iconv-f“$CHARSET”-t utf8“$i”-o输出文件
fi

编译所有这些文件。转到dir,创建dir2utf8.sh:

#/bin/bash
#将目录中的所有文件转换为utf8
为f英寸*
做
如果测试-f$f,则
echo-e“\n转换$f”
CHARSET=“$(file-bi“$f”| awk-f”=“{print$2}”)
如果[“$CHARSET”!=utf-8];然后
iconv-f“$CHARSET”-t utf8“$f”-o“$f”
fi
其他的
echo-e“\n跳过$f-这是一个常规文件”;
fi
完成
以下是使用和放置所有文件的步骤:

#/bin/bash
apt get-y安装记录uchardet>/dev/null
查找“$1”-在读取FFN时键入f |“dir”应更改。。。
做
编码=$(uchardet“$FFN”)
echo“$FFN:$encoding”
enc=`echo$encoding | sed's#^x-mac-#mac#'`
集合+x
重新编码$enc..UTF-8“$FFN”
完成
将其放入
convert-dir-to-utf8.sh
并运行:

bash convert-dir-to-utf8.sh /pat/to/my/trash/dir
请注意,
sed
是mac编码的一种变通方法。
许多不常见的编码都需要这样的解决方法。

检查linux cli中数据转换可用的工具:


此外,还有一项任务是找出
iconv
中提供的完整编码列表。只要运行
iconv--list
,就可以发现编码名称与
uchardet
工具返回的名称不同(例如
uchardet
中的x-mac-cyrlic与
iconv
中的mac-cyrlic),enca命令不适用于使用GB2312编码的简体中文文本文件

相反,我使用以下函数为我转换文本文件。 当然,您可以将输出重新定向到文件中

它需要chardeticonv命令

detection_cat () 
{
    DET_OUT=$(chardet $1);
    ENC=$(echo $DET_OUT | sed "s|^.*: \(.*\) (confid.*$|\1|");
    iconv -f $ENC $1
}
第一个答案
#/bin/bash
查找“”-name'*'-type f-exec grep-Iq。{} \; -打印0|
而IFS=read-r-d$'\0'行\u文件;做
字符集=$(uchardet$行\u文件)
echo“转换($CHARSET)$LINE\u文件”
#注:转换/再转换为utf8。奎斯托
iconv-f“$CHARSET”-t utf8“$LINE\u文件”-o“$LINE\u文件”
#注意:如果存在“BOM”,则删除它,因为它是不必要的。奎斯托
#[参考文献:https://stackoverflow.com/a/2223926/3223785 ,
# https://stackoverflow.com/a/45240995/3223785 ]
sed-i'1s/^\xEF\xBB\xBF/'“$LINE_文件”
完成
#[参考文献:https://justrocketscience.com/post/handle-encodings ,
# https://stackoverflow.com/a/9612232/3223785 ,
# https://stackoverflow.com/a/13659891/3223785 ]
进一步的问题:我不知道我的方法是否最安全。我这样说是因为我注意到一些文件没有正确转换(字符将丢失)或被“截断”。我怀疑这与“iconv”工具或通过“uchardet”工具获得的字符集信息有关。我对这个解决方案很好奇,因为它可能更安全

另一个答案 根据@demofly的回答:

#/bin/bash
查找“”-name'*'-type f-exec grep-Iq。{} \; -打印0|
而IFS=read-r-d$'\0'行\u文件;做
字符集=$(uchardet$行\u文件)
REENCSED=`echo$CHARSET | sed's#^x-mac-#mac#'`
回显“\”$CHARSET\“\”$LINE\u文件”
#注:转换/再转换为utf8。奎斯托
重新编码$RENCSED..UTF-8“$LINE_文件”2>标准操作1>标准操作
标准值=美元(cat标准值)
rm-f标准操作
如果[-n“$STDERR_OP”];然后
#注:转换/再转换为utf8。奎斯托
iconv-f“$CHARSET”-t utf8“$LINE_文件”-o“$LINE_文件”2>标准字符集操作1>标准字符集操作
标准值=美元(cat标准值)
rm-f标准操作
fi
#注意:如果存在“BOM”,则删除它,因为它是不必要的。奎斯托
#[参考文献:https://stackoverflow.com/a/2223926/3223785 ,
# https://stackoverflow.com/a/45240995/3223785 ]
sed-i'1s/^\xEF\xBB\xBF/'“$LINE_文件”
如果[-n“$STDERR_OP”];然后
echo“错误:\“$STDERR\u OP”
fi
STDOUT\U OP=$(cat STDOUT\U OP)
rm-f标准件
如果[-n“$STDOUT_OP”];然后
echo“结果:\“$STDOUT\u OP”
fi
完成
#[参考文献:https://justrocketscience.com/post/handle-encodings ,
# https://stackoverflow.com/a/9612232/3223785 ,
# https://stackoverflow.com/a/13659891/3223785 ]
第三个答案 带重新编码和vim的混合解决方案:<