文档章节

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

S
 StSphinx
发布于 2015/08/14 16:52
字数 794
阅读 487
收藏 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
270
0
linux 下中文文件乱码问题解决

经常遇到:windows下通过xftp上传到linux服务器中的中文名文件出现乱码的情况。 业务场景:有一个公共的下载目录,里面可能会有中文名的文件,在web端显示的时候出现乱码,导致下载出错的问题...

哥本哈根的小哥
2018/11/16
46
0
[转]Linux查看文件编码格式及文件编码转换

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

mj4738
2012/04/26
409
2
SecureCRT连接Linux时VIM中文乱码

在SecureCRT连接Linux机器进行程序文件和配置编辑时,经常会遇到各种乱码问题: 1、Linux下的文本显示有乱码; 2、即使显示出来没有乱码,将文本复制粘贴到其他windows程序中也会是乱码, 3、...

鉴客
2011/10/25
2.1K
0
如何在 Linux 中删除文本中的回车字符

当回车字符()让你紧张时,别担心。有几种简单的方法消除它们。 “回车”字符可以往回追溯很长一段时间 —— 早在打字机上就有一个机械装置或杠杆将承载纸滚筒的机架移到右边,以便可以重新...

作者: Sandra Henry-stocker
09/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

mysql-connector-java升级到8.0后保存时间到数据库出现了时差

在一个新项目中用到了新版的mysql jdbc 驱动 <dependency>     <groupId>mysql</groupId>     <artifactId>mysql-connector-java</artifactId>     <version>8.0.18</version> ......

ValSong
今天
5
0
Spring Boot 如何部署到 Linux 中的服务

打包完成后的 Spring Boot 程序如何部署到 Linux 上的服务? 你可以参考官方的有关部署 Spring Boot 为 Linux 服务的文档。 文档链接如下: https://docs.ossez.com/spring-boot-docs/docs/r...

honeymoose
今天
6
0
Spring Boot 2 实战:使用 Spring Boot Admin 监控你的应用

1. 前言 生产上对 Web 应用 的监控是十分必要的。我们可以近乎实时来对应用的健康、性能等其他指标进行监控来及时应对一些突发情况。避免一些故障的发生。对于 Spring Boot 应用来说我们可以...

码农小胖哥
今天
8
0
ZetCode 教程翻译计划正式启动 | ApacheCN

原文:ZetCode 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远。 ApacheCN 学习资源 贡献指南 本项目需要校对,欢迎大家提交 Pull Request。 ...

ApacheCN_飞龙
今天
5
0
CSS定位

CSS定位 relative相对定位 absolute绝对定位 fixed和sticky及zIndex relative相对定位 position特性:css position属性用于指定一个元素在文档中的定位方式。top、right、bottom、left属性则...

studywin
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部