shell 脚本递归gb2312转UTF-8

        shell 中有一个命令可以将文件转成指定的编码文件,一般用法:iconv -f from-encoding -t to-encoding inputfile -o outputfile,-f 即为 from,源编码格式,-t 即为 to,目标编码格式,iconv -l 可以列出 iconv 所支持的所有编码格式。

        以下是一个实例:以前的项目代码用的是 Source Insight 3.5 编辑的,这个版本不支持UTF-8,所以当时编辑出来的文件都是gb2312编码的。但是用 VScode 打开时原先的中文注释就会显示为乱码,用这个脚本将这些文件转为 UTF-8 格式,有一些原来不是gb2312的,转成UTF-8 也还是有乱码。

#!/bin/sh

if [ $# != 1 ]; then
    echo "Usage: $0 dir"
    exit
fi

dir=$1

#取第一个参数的最后一个字符,由于tab自动补全会带有"/",而下面的函数里路径已经添加了"/"
lastChar=${1: -1} 
if [ "/" == "${lastChar}" ]; then
    len=${#1} #第一个参数的长度
    dir=${1:0:len-1} #不要最后的"/"
    echo ${dir}
fi

function changeEncode()
{
    for fileName in `ls $1`
    do
        if [ -d $1/${fileName} ]; then
            echo -e "\033[31mentry $1/${fileName}\033[0m"
            changeEncode $1/${fileName}  #递归调用,继续把子目录作为参数来调用函数
        else
            file $1/${fileName} | xargs | grep -n "ISO-8859"
            if [ $? -eq 0 ]; then
                iconv -f GB2312 -t UTF-8 $1/${fileName} -o $1/${fileName}
            fi
        fi
    done
}

changeEncode ${dir}

关于编码的知识并不是很了解,这里的 “ISO-8859” 是一个字符集,它和GB2312并不相等,这里只是结合了命令 file 的结果:

 然后再用 notepad++打印文件,看到的就是GB2312的编码格式,如:

所以这里脚本简单地判断 file的结果里有 ISO-8859 就将其转换成 UTF-8,其效果前后对比:

 脚本适用于修改多个文件,单个文件可以用notepad++打开,然后菜单上 Encoding -> convert to UTF-8 即可。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值