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 即可。