linux 批量转换UTF8到GB2312并处理UTF8的BOM标记
背景
内容本人在使用oracle的sqlplus批量导入UTF8编码的sql脚本时,由于不了解如何设置让sqlplus识别UTF8格式,导致出现乱码、错行等错误,而使工作无法继续,在google无果的情况下只好想办法转换编码。
由于文件较多,手动转换太麻烦,于是想到用脚本批量转换,幸好网上相关脚本比较多,实现起来唯一的麻烦是UTF8的BOM标记。
下面脚本经本人测试可以工作,欢迎高手留言指正
解释#!/bin/bashfor loop in `find . -type f -name "*.sql" -print`doecho $loopmv -f $loop $loop.tmpdos2unix $loop.tmpfile_check_utf8='file_check_utf8.log'sed -n '1l' $loop.tmp >$file_check_utf8if grep '^\\357\\273\\277' $file_check_utf8 >/dev/null 2>&1thenecho 'UTF-8 BOM'sed -n -e '1s/^...//' -e 'w intermediate.txt' $loop.tmpiconv -f UTF-8 -t GB2312 -o $loop intermediate.txtrm -rf intermediate.txtrm -rf $loop.tmpelif iconv -f UTF-8 -t GB2312 $loop.tmp >/dev/null 2>&1thenecho 'UTF-8'iconv -f UTF-8 -t GB2312 -o $loop $loop.tmprm -rf $loop.tmpelseecho 'ANSI'mv -f $loop.tmp $loopfirm -rf $file_check_utf8#模拟unix2dos,要求文本文件最后一行必须有换行符sed -n -e 's/$/\r/g' -e 'w '$loop.tmp $loopmv -f $loop.tmp $loopdone