文件的编码问题解决

前言

很多时候,我们需要在linux(ubuntu,centos等)、mac和windows之间共享一些文件,但是因为各个平台自带支持的编码不一致,有的是GB2312(window默认),有的是utf-8。导致跨平台无法正确打开文件,比如windows下的GB2312编码文件放到mac下,如果mac没有安装GB2312解码器,那打开就乱码。这里总结了文件格式的相互转换,目标当然是全球统一的utf-8,utf-16等utf系列编码。

查看文件编码工具安装

windows 文件编码格式查看和转换

windows平台可以通过notepad ++ 查看文件的编码,同时也可以保存为指定编码的问题文件,比如下图,查看是ANSI格式编码。
在这里插入图片描述
转换时,只需要选择对应的编码格式,下方可以转为utf-8或其他编码,如下图:
在这里插入图片描述

linux(ubuntu/centos)&mac等文件编码格式安装

apt-get install enca   # ubuntu
brew install enca      # mac
yum install enca      # centos

查看文件编码

# 查看指定文件的编码格式
enca -L zh_CN filename    # 或者
enca filename

# 查看当前目录下所有文件的编码
enca `ls`   # 引号为tab键上方的字符

如下图查看当前文件的字符编码,有GB2312,有7个二进制编码的文件(一行对应一个文件)。
在这里插入图片描述
文件中出现了部分文件是 7bit ASCII characters的文件,这是因为整个文件中没有中文字符,所以就这样显示,如果你写两个中文字符到文件中,你会神奇的发现编码格式显示为utf-8。

转换编码

# 转换指定文件到utf-8
enca -L zh_CN -x UTF-8 filename   //或
enca -x UTF-8 filename

# 转换当前目录下所有文件到utf-8
enca -L zh_CN -x utf-8 *   # 或
enca -x utf-8 *

转换格式后查看结果如下:
在这里插入图片描述

多层目录文件格式转换

从mayue_web的博客中看到了一个shell脚本转换文件格式的,这里也一并贴出来,供大家参考。

cli="find . -type f ( "
for arg in ${@:1:$#-1}
do
	cli="$cli -iname *.$arg -o "
done
cli="$cli -iname *.${@: -1} )"
#echo $cli
PRE_IFS=$IFS
IFS=$'
'
for i in `eval $cli`
do
	enca -x utf-8 $i
done
IFS=$PRE_IFS
echo "ok!"

其实作为一个开发人员,完成可以写个如python的脚本,来遍历多层子文件,python脚本如下:

import os
import sys
def recursive_visitor(file_dir):
    for filename in os.listdir(file_dir):

        # filter some file
        if filename.startswith('.'):
            continue

        # only convert py file to utf-8
        file_path = os.path.join(file_dir, filename)
        if os.path.isfile(file_path) and filename.endswith('.py'):
            cmd_str = "enca -x UTF-8 %s" % file_path
            ret = os.system(cmd_str)
            if ret:
                print("-- convert file to utf-8 failed, please check the file: {} ----".format(file_path))
                sys.exit(1)

        if os.path.isdir(file_path):
            recursive_visitor(file_path)

参考文献

https://blog.csdn.net/mayue_web/article/details/89382470
https://blog.csdn.net/mayue_web/article/details/89384982

 
原文地址:https://www.cnblogs.com/lidabo/p/15527647.html