目录
使用Linux下载工具下载东西总会遇到这样的问题,下载的文件名是乱码的。这种现象在百度文库和中国知网上最为常见。下面说说原因与解决方案。
一、原因
一般Linux默认编码方式为UFT-8,而很多网站下载的文件名则使用GB2312的编码方式,所以下载的时候必然会产生乱码。最为重要的是,Linux将会以UTF-8的格式来存储这些文件名,即在linux下,这些文件名依旧是UTF-8格式的(不过是乱码),所以直接采用GB2312转UFT-8是行不通的,会提示文件名已经是UFT-8格式了。
二、解决方案
2.1 使用shell脚本解决
试试运行一下面这个命令1:
$ echo -n 'Êýѧ¹éÄÉ·¨µÄ·¢Õ¹Àú³Ì_·ë½ø.pdf'|iconv -f utf8 -t iso-8859-1|iconv -f gbk -t utf8
这个命令改造一下即可直接重命名文件了。将下内容保存,命名为uft8filename.sh
#!/usr/bin/env bash filename=$(echo -n "$1" |iconv -f uft8 -t iso-8859-1|iconv -f gbk -t uft8) mv "$1" "${filename}"
然后加上可执行权限,即可修改任意文件名了。
$ chmod +x ./uft8filename.sh ./uft8filename.sh "Êýѧ¹éÄÉ·¨µÄ·¢Õ¹Àú³Ì_·ë½ø.pdf"
2.2 使用python代码解决
同样的,将下面代码保存至uft8filename.py,然后加上可执行权限,使用方法和上面相同。
#!/usr/bin/env python2 # -*- coding: utf8 -*- import os import sys def main(): args = sys.argv[1:] for name in args: name = name.decode('utf8') try: converted = name.encode('latin-1').decode('gb18030') except UnicodeEncodeError: continue if name == converted: continue # print will fain if script not run in terminal try: print converted except UnicodeEncodeError: pass os.rename(name, converted) if __name__ == '__main__': main()
2.3 右键集成
上面脚本都必须使用终端命令来完成转找,可是输入命令来完成这个小动作还是比较麻烦的,最为重要的是,那个乱码文件其实并不好输入,一般只能靠复制粘贴来解决,这更加增加过程的复杂度,所以还是使用右键文件,然后直接选取相应的执行脚本来完成文件名转换还是有必要的。
对于ubuntu用户可以安装一下ubuntu Tweak,里面有一个scripts的功能,可以在文件管理器右键添加一个scripts选项,只需要将上面写好脚本直接放到其中,即可实现右键文件名转换,方便了很多。
三、更进一步解释
3.1 IOS8859-1
IOS8859-1是为单字节编码,最多能表示的字符范围为0-255,和ASCII编码方式相似。虽然它本身不能表示更多的字符,如中文字符,然而由于它是单字节编码方式,所以可以以它为基础,然后多字节编码,即可表示更多的字。例如:”中文”,如果采用gb2312的编码方式,为d6d0cec4,这样自然可以看作4个单字节组成。在上面使用shell脚本即是采用IOS8859-1作为中间的单字节编码方式,从而完成gbk与uft8的转换。
3.2 GB2312/GBK
汉字的国标码,专用于表示汉字的双字节编码方式。GB2312只能表示简体字,而GBK则可以表示简体和繁体。这种编码方式在微软的内部又称为cp936。GB2312/GBK编码方式也不是定长的编码。
3.3 unicode
这是最统一的编码,可以用来表示所有语言的字符,而且是定长双字节(也有四字节的)编码,包括英文字母在内,与其它的编码不具有兼容性,如IOS8859-1。
3.3 UTF
UTF-8 采用了不等字节长的编码方式,英文字符只占用一个字节,而中文则一般占用3个字节。相对于Unicode来说,它主要更加省空间,同时也保持到了与IOS8859-1的兼容性2。
四、参考文献
- RecursiveG.各位V友,在Linux中下载的中国知网论文,标题是乱码,请教简便地如何使标题恢复正常.V2EXhttps://www.v2ex.com/t/179961.2015/03/28 ↩
- wind333sss.Unicode、UTF-8和ISO8859-1到底有什么区别.百度文库.http://wenku.baidu.com/view/d07133e9f8c75fbfc77db270.html.2012/09/26 ↩