问题描述

有很多多层文件夹存放的数据保存在windows上,文件夹和文件名均含有中文,将这些文件目录传到linux上,中文名显示乱码。

问题分析

windows上中文默认编码格式是gbk,而linux默认编码格式是utf-8,因此需要将文件名转码。

解决过程

1、linux工具convmv
# yum install convmv
convmv -f gbk -t utf-8 -r --notest .(文件夹路径)

部分文件夹及文件中文名可正常显示,但仍有两个问题:

1、部分中文路径显示:正在跳过,已经是 utf8”,乱码字符并未改变;
2、部分子文件夹下文件并未成功转码,仍是乱码。
2、python

解决第一个问题:

name = '乱码字符' # 拷贝linux下的乱码字符
new_name = name.encode('utf-8').decode('gbk') 
print(new_name) # 此时显示乱码字符的中文名称,在shell下重命名文件名即可,mv name new_name。

解决第二个问题:

convmv -r 应该是递归子文件夹,但仍存在部分子文件夹下文件名未进行转码,因此编写bash 脚本批量转码。

#!/bin/bash

func () {
    local dir="$1"
    for f in `ls $1`
    do
        if [ -f "$dir/$f" ]
        then
            echo "$dir/$f is file, pass"
        elif [ -d "$dir/$f" ]
        then
            convmv -f gbk -t utf-8 -r --notest "$dir/$f/"
            func "$dir/$f"
        fi
    done
}
func $1     

./gbk2utf8.sh .(文件路径)

至此,两种方法结合,问题基本搞定。部分文件夹中文名无法用convmv转码的原因,初步分析应该是来源和其它的不一样,但用python可以获取到原来的中文名,进行重命名即可解决。附上python批量转码的代码。

def gbk2utf(dir_path):
    for root, dirs, files in os.walk(dir_path, topdown=False):
        for file_name in files:
            new_name = file_name.encode('utf-8').decode('gbk')
            new_path = os.path.join(root, new_name)
            old_path = os.path.join(root, file_name)
            os.rename(old_path, new_path)
        for dir_name in dirs:
            new_dir_name = dir_name.encode('utf-8').decode('gbk')
            new_dir_path = os.path.join(root, new_dir_name)
            old_dir_path = os.path.join(root, dir_name)
            os.rename(old_dir_path, new_dir_path)

# 查询字符串的编码格式
# import chardet
# chardet.detect(s)

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐