文档章节

有关linux与windows中文件名的编码问题总结

S
 StSphinx
发布于 2015/08/14 16:52
字数 794
阅读 115
收藏 0

最近在整理各种裤子,由于太大用了ntfs-3g挂载硬盘,拷贝到了centos服务器上,结果没有注意文件名的编码问题,总要修改所以说config/i18n配置文件,而且通过ssh连接要经常切换客户端的字符集,无奈,拷回硬盘上,在window上弄吧,结果,文件名出现各种乱码。。。。崩溃了。安心学习了。。。

(其中涉及到了ntfs-3g,ssh远程客户端,以及linux的/etc/sysconfig/i18n配置,没有一一测试,除了ntfs-3g不知道是否涉及字符集,其他都涉及到了,思路比较乱,想到哪写到哪了)

问题根源:由于Linux与windows采用了不同的字符集来处理中文文件名,Linux用了utf-8而windows用了gbk,进而导致文件名处理的混乱。

我的做法是:

1、利用convmv 在linux上将所有文件名编码转换为gbk,再通过ntfs-3g将文件拷到移动硬盘,最后拷回电脑,在windows上能够正常显示。

2、处理文件

3、将文件拷回linux

4、利用convmv将文件名转回utf8

由于习惯了在windows上开发, 想自己写一个py脚本实现在windows上将文件名字符编码进行转换的功能,但是马上问题就出现了。

下面请看:

def conv_gbk_to_utf8(path):
    if os.path.exists(path):
        print 'converting filename to utf8...'
    else:
        print 'The path is invalid!'
        return -1
    for root, dirs, files in os.walk(path):
        for filename in files:
            charset = chardet.detect(filename)
            if charset.get('encoding') in ['utf-8', 'ascii']:
                continue
            else:
                print charset
                conv_filename = filename.decode('gbk').encode()
                res_filename = os.path.join(root, filename)
                conv_filename = os.path.join(root, conv_filename)
                shutil.move(res_filename, conv_filename)
    # modified the charset of name of the dirs
    for root, dirs, files in os.walk(path):
        for dir in dirs:
            charset = chardet.detect(dir)
            if charset.get('encoding') in ['utf-8', 'ascii']:
                continue
            else:
                conv_dir = dir.decode('gb2312').encode()
                res_dir = os.path.join(root, dir)
                conv_dir = os.path.join(root, conv_dir)
                print res_dir, conv_dir
                shutil.move(res_dir, conv_dir)

对于一般的文件名都没问题,但是由于windows对文件命名有着一个限制。就是 ? : " < > 等符号无法被作为合法字符。

那么当一个名为 新建文件夹 的文件夹 ,将字符集从gbk转换为utf8之后,会显示为:鏂板缓鏂囦欢澶, 其编码为:E6 96 B0 E5 BB BA E6 96 87 E4 BB B6 E5 A4 B9 ,如果用编辑工具转换发现实际转换后的字符应该是鏂板缓鏂囦欢澶? B9被丢弃了。

结论:在用程序转换后,出现的特殊字符,会被操作系统丢弃,因而也无法复原。所以这种方法,目前走不通。。。也隐约证明了,为什么之前在网上搜索文件名编码转换工具都找不到了吧。。。。

ps:回去又研究了下,shutil.move的实现方法是对文件直接调用os.rename对文件夹采用copytree和rmtree来实现重命名目录的。在copytree中调用了

os.makedirs(dst)

然后调用了nt.py中的

mkdir(name, mode)

 

这步是有c实现的底层库,而在这步就会产生丢字节B9的现象,因此如果想实现此功能需要修改底层实现。 

© 著作权归作者所有

共有 人打赏支持
S
粉丝 0
博文 18
码字总数 8025
作品 0
东城
linux和windows双系统互拷文件乱码问题

如果你需要在linux下面用到windows下的文件,拷贝上去后经常发现中文显示乱码。。原因是Windows中默认的文件格式是 GBK(gb2312),而Linux一般都是UTF-8。比较繁琐的方法是在windows下用程序把...

wzqlcf
2014/07/10
0
0
[转]Linux查看文件编码格式及文件编码转换

如果你需要在Linux 中操作windows下的文件 ,那么你可能会经常遇到文件 编码 转换的问题。Windows中默认的文件 格式是GBK(gb2312),而Linux 一般都是UTF-8。下面介绍一下,在Linux 中如何查看...

mj4738
2012/04/26
0
2
Git跨平台中文乱码临时解决方案

Git 是一个非常优秀的分布式版本控制系统,最初为Linux Kernel版本管理进行量身定做。优点是,和其他版本控制系统相比,稳定,速度快,跨平台,易学易用,无需要花费成本。更多优点请点击阅读...

怪蜀黍
2012/04/16
0
4
关于Tomcat下项目中文名在Windows和Linux下编码混乱问题解决

公司的项目一直是在Windows下的Tomcat里面跑着,一切正常,但是今天切到Linux下的Tomcat后,由于编码问题,出现了点小状况。 问题具体是这样的,Web项目中,有个根据表格上传下载的功能,我们...

闻术苑
2013/11/30
0
4
文件,文本文件以及编码——乱码探源(1)

在前面的字符集编码系列中,已经探讨了几大主要的字符集编码。在此基础之上,这里将进一步探讨编码的应用及乱码的根源,我们先从基本的文件说起。 文件 文件(内容)就是字节序列。文本文件也...

国栋
2015/05/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

go语言学习总结

一、描述 go语言是直接将源码编译成二进制机器码的语言;它支持面向对象、也支持函数式编程;支持并发很容易; 二、基本语法学习路径 https://studygolang.com/subject/2...

盼望明天
15分钟前
1
0
JSP 九大内置对象及其作用域

JSP 中一共预先定义了 9 个这样的对象,分别为:request、response、session、application、out、pagecontext、config、page、exception ,下面就简单介绍下。 1、request 对象 request 对象...

几个栗子
26分钟前
0
0
Java中的坑之方括号

Java中的坑之方括号 这一段时间,在做项目的时候,发现了一个坑,这个坑说大不大,说小不小,不知道的足够喝一壶,知道的就可以轻松解决。 问题描述 在做数据统计的时候,遇见了如下形式的数...

星汉
37分钟前
1
0
[雪峰磁针石博客]python机器学习、web开发等书籍汇总

Building Machine Learning Systems with Python Third Edition - 2018.pdf 下载地址 Get more from your data by creating practical machine learning systems with Python Key Features ......

python测试开发人工智能安全
48分钟前
1
0
文件的压缩与解压(linux)

Linux下*.tar.gz文件解压缩命令 1.压缩命令:   命令格式:tar -zcvf 压缩后文件名.tar.gz 被压缩文件名 可先切换到当前目录下。压缩文件名和被压缩文件名都可加入路径。 2.解压缩命令: ...

qimh
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部