linux系统下批量转换UTF8到GB2312并处理UTF8的BOM标记

背景

本人在使用oracle的sqlplus批量导入UTF8编码的sql脚本时,由于不了解如何设置让sqlplus识别UTF8格式,导致出现乱码、错行等错误,而使工作无法继续,在google无果的情况下只好想办法转换编码。

由于文件较多,手动转换太麻烦,于是想到用脚本批量转换,幸好网上相关脚本比较多,实现起来唯一的麻烦是UTF8的BOM标记。

内容:

复制代码

代码如下:

#!/bin/bash
for loop in `find . -type f -name "*.sql" -print`do
echo $loop
mv -f $loop $loop.tmp
dos2unix $loop.tmp
file_check_utf8='file_check_utf8.log'
sed -n '1l' $loop.tmp >$file_check_utf810. if grep '^//357//273//277' $file_check_utf8 >/dev/null 2>&111. then
echo 'UTF-8 BOM'
sed -n -e '1s/^...//' -e 'w intermediate.txt' $loop.tmp14. iconv -f UTF-8 -t GB2312 -o $loop intermediate.txt15. rm -rf intermediate.txt
rm -rf $loop.tmp
elif iconv -f UTF-8 -t GB2312 $loop.tmp >/dev/null 2>&118. then
echo 'UTF-8'
iconv -f UTF-8 -t GB2312 -o $loop $loop.tmp21. rm -rf $loop.tmp
else
echo 'ANSI'
mv -f $loop.tmp $loop
fi
rm -rf $file_check_utf8
#模拟unix2dos,要求文本文件最后一行必须有换行符28. sed -n -e 's/$//r/g' -e 'w '$loop.tmp $loop29. mv -f $loop.tmp $loop
done

#!/bin/bash
for loop in `find . -type f -name "*.sql" -print`do
echo $loop
mv -f $loop $loop.tmp
dos2unix $loop.tmp
file_check_utf8='file_check_utf8.log'
sed -n '1l' $loop.tmp >$file_check_utf810. if grep '^//357//273//277' $file_check_utf8 >/dev/null 2>&111. then
echo 'UTF-8 BOM'
sed -n -e '1s/^...//' -e 'w intermediate.txt' $loop.tmp14. iconv -f UTF-8 -t GB2312 -o $loop intermediate.txt15. rm -rf intermediate.txt
rm -rf $loop.tmp
elif iconv -f UTF-8 -t GB2312 $loop.tmp >/dev/null 2>&118. then
echo 'UTF-8'
iconv -f UTF-8 -t GB2312 -o $loop $loop.tmp21. rm -rf $loop.tmp
else
echo 'ANSI'
mv -f $loop.tmp $loop
fi
rm -rf $file_check_utf8
#模拟unix2dos,要求文本文件最后一行必须有换行符28. sed -n -e 's/$//r/g' -e 'w '$loop.tmp $loop29. mv -f $loop.tmp $loop
done

解释

1.处理UTF8的BOM,本人没有找到好的办法,最后用sed+grep判断了一下,如果前三个字节是//357//273//277,则文件必定是UTF8,用sed去掉这三个字节再转换

2.为了避免重复或者遗漏,脚本中用iconv对没有BOM的文件尝试转换了一把,转换成功说明文件是UTF8,否则说明是ANSI也就是GB2312

3.关于最后的sed命令,那是因为本人的系统上没有unix2dos命令,所以进行了模拟,目的是为了方便自己在windows下查看和编辑

以上就是linux 批量转换UTF8到GB2312并处理UTF8的BOM标记 的方法,谢谢阅读,希望能帮到大家,请继续关注脚本之家,我们会努力分享更多优秀的文章。

(0)

相关推荐

  • Linux系统下批量压缩图片尺寸大小的方法

    现在手机用户非常庞大,针对手机用户的流量不得不考虑,但手机网络带宽较小,怎么将互联网上的图片压缩是个难题,在windows上容易,有很多软件,但在linux上有没有办法呢? 经过多次的寻找,还是找到了 ...

  • linux系统下怎么压缩图片

    Linux系统下 批量压缩图片尺寸大小的方法 现在手机用户非常庞大,针对手机用户的流量不得不考虑,但手机网络带宽较小,怎么将互联网上的图片压缩是个难题,在windows上容易,有很多软件,但在linu ...

  • Linux系统下加载U盘设备时文件乱码的有效解决方法

    很少情况会在Linux系统下使用U盘,但是最近有朋友在Linux系统下加载U盘设备的时候发现U盘内的文件出现了乱码现象,这该怎么办呢?很多朋友对Linux系统又不太熟悉,不知道该怎么操作,没关系,让小 ...

  • Linux系统如何批量压缩图片尺寸大小

    现在的数码相机拍摄出来的照片像素都很高,大部份都会超过此限制,很多时候我们都要对图片进行批量压缩,Linux系统下如何批量压缩图片尺寸大小呢? 一个比较好用命令行下可以使用的 强大的免费图片工具 Im ...

  • 切换Linux系统下图形界面与Linux命令行模式

    本文为您讲解假如在Linux系统下实现图形界面与Linux命令行模式切换。 一、Linux系统安装的流程中默认语言是英文,而不是中文简体(安装流程中有两次制定语言选项,起决定作用的是第二次) 二、Li ...

  • Linux系统下使用mail发送Internet邮件的配置方法

    用惯了windows系统的用户可能一开始对linux系统掌握不好,很多功能可能用起来不是很习惯。本文就介绍了linux系统的一个小应用:在Linux系统下使用mail发送Internet邮件。不过在介 ...

  • Linux系统下添加新硬盘,分区,格式化相关步骤

    预备知识 在我们添加硬盘前,首先要了解linux系统下对硬盘和分区的命名方法。 在Linux下对IDE的设备是以hd命名的,第一个ide设备是hda,第二个是hdb。依此类推 我们一般主板上有两个ID ...

  • Linux系统下修改环境变量PATH路径的三种方法

    电脑中必不可少的就是操作系统。而Linux的发展非常迅速,有赶超微软的趋势。这里介绍Linux的知识,让你学好应用Linux系统。比如要把/etc/apache/bin目录添加到PATH中,方法有三: ...

  • Linux系统下添加硬盘+分区+格式化详解

    在我们添加硬盘前,首先要了解linux系统下对硬盘和分区的命名方法。在Linux下对IDE的设备是以hd命名的,第一个ide设备是hda,第二个是hdb。依此类推我们一般主板上有两个IDE接口,一共可 ...