Linux下载文件名中文乱码

使用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,这样自然可以看作8个单字节组成。在上面使用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.

四、参考文献


  1. RecursiveG.各位V友,在Linux中下载的中国知网论文,标题是乱码,请教简便地如何使标题恢复正常.V2EXhttps://www.v2ex.com/t/179961.2015/03/28 
  2. wind333sss.Unicode、UTF-8和ISO8859-1到底有什么区别.百度文库.http://wenku.baidu.com/view/d07133e9f8c75fbfc77db270.html.2012/09/26 
此条目发表在LINUX分类目录,贴了标签。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。