• CentOS上解压ZIP乱码的解决办法


    今天在学校做实验需要解压缩一些范例程序,我准备在我的电脑上把这个实验做完,所以就把文件copy到我的CentOS里面去了。

    但是万万没想到``````解压缩的时候悲剧了,用unzip解压出来一大堆乱码文件,只要是中文的名称全都是乱码。

    我当时查了无数博客,论坛,无外乎两个办法:

    1.用 unzip -O utf-8

    但是-O这个命令老早就没了啊大哥!麻烦你们复制粘帖的时候自己实践下好吗!

    2.用7zip

    这个靠谱,我用"7z x xxx.zip"成功的解压出来了``````````另外一堆乱码。当时真的是欲哭无泪啊,又找了十几二十页谷姐度娘,才找到一位神人的解决方法,亲测可行,在这里我记录一下时间:2014 4 14 CentOS6.5.

    步骤:

    (1).先用“7z x xxx.zip”解压你的zip文件,然后,把有乱码的文件和文件夹移动到另外一个文件夹

    (2).在shell里面键入命令"convmv -r -f utf8 -t iso88591 * --notest --nosmart && convmv -r -f gbk -t utf8 * --notest --nosmart"

    从此,世界安静了````````中文啊!你会发现那万恶的乱码君消失在你的屏幕里。

    这里先mark一下解决方法的网址:http://forum.ubuntu.org.cn/viewtopic.php?t=261811

    再把文章转载一下方便查看:

    本地化问题对我这种菜鸟来说就等于解决各种各样的乱码,而文件名乱码是最惹人眼烦的。 
    本着自己以后方面查,大家来拍砖的想法,现在小结一些: 
    一、“GBK乱码”,参考 http://forum.ubuntu.com.cn/viewtopic.php?f=35&t=213575&start=0 
    乱码的样子类似:

    代码:

    °²Àï¿ü ÒÁ¸ñÀ³Ï£ÑÇ˹,°²Àï¿ü ÒÁ¸ñÀ³Ï£ÑÇ˹
    解决方法: 
    1.使用convmv 
    把乱码文件名文件复制在一个空目录里运行(这样错了也不怕):

    代码:

    convmv -r -f utf8 -t iso88591 * --notest --nosmart && convmv -r -f gbk -t utf8 * --notest --nosmart

    2.以前有人建议在 /etc/environment 里添加

    代码:

    env LANG=zh_CN.GBK firefox

    ,但我不明白为何我这里收效甚微。 
    二、.“ascii乱码”参考 http://forum.ubuntu.org.cn/viewtopic.php?f=21&t=244095&view=previous

    乱码的样子类似:

    代码:

    %E5%8C%BB%E4%BF%9D

    解决方法: 
    1.使用uni2ascii

    代码:

    echo 乱码原文 | ascii2uni -a J

    2.安装nautilus-filename-repairer0.06(官方有源码,但是依赖问题,我还没安装成功,而0.05版与现在的nautilus有点小小的合作障碍,只能看不能改名) 
    3.用chromeplus-1.3.3.1下载(因为这类乱码主要在用ff(默认utf8)下载qq群里的文件之后产生,用chromeplus(默认GBK)下就没问题了) 
    另外,至于文件里面内容的乱码问题可以搜索enca

     

    复制代码
    1.向系统添加windows下的字符编码:
    sudo vim /var/lib/locales/supported.d/local
    添加一下编码:
    zh_CN.GBK GBK
    zh_CN.GB2312 GB2312
     
    2.向系统中文字符添加相应编码
    sudo vim /var/lib/locales/supported.d/zh-hans
    添加以下编码:
    zh_CN.GBK GBK
    zh_CN.GB2312 GB2312
     
    3.更新系统编码:
    sudo locale-gen
    
    4.使用unzip命令解压:
    unzip -O CP936 xxxx.zip
    复制代码
    复制代码
    解决办法一,利用pyton来处理
    1.vi /opt/uzip/uzip.py文件
    2.复制一下内容(Python)
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # uzip.py
     
    import os
    import sys
    import zipfile
     
    print "Processing File " + sys.argv[1]
     
    file=zipfile.ZipFile(sys.argv[1],"r");
    for name in file.namelist():
        utf8name=name.decode('gb18030')#比gbk范围广
        print "Extracting " + utf8name
        pathname = os.path.dirname(utf8name)
        if not os.path.exists(pathname) and pathname!= "":
            os.makedirs(pathname)
        data = file.read(name)
        if not os.path.exists(utf8name):
            fo = open(utf8name, "w")
            fo.write(data)
            fo.close
    file.close()
    3.chmod +x /opt/opt/uzip.py
    4.vi /usr/bin/uzip
      #!/bin/bash
      /opt/uzip/uzip.py $1 5.uzip xxxx.zip 方法2,通过unzip行命令解压,指定字符集 unzip -O CP936 xxx.zip (用GBK, GB18030也可以) 有趣的是unzip的manual中并无这个选项的说明,unzip –help对这个参数有一行简单的说明。 方法3,在环境变量中,指定unzip参数,总是以指定的字符集显示和解压文件 /etc/environment中加入2行 UNZIP=”-O CP936″ ZIPINFO=”-O CP936″ 方法4,采用java的jar命令解压zip包 JAR 解压 jar xvf file.name
    复制代码
    复制代码
    1:再压缩前,要设置linux模式, 需要使用第三方ant-1.6.5.jar
      如果是文件目录,则
    ZipEntry zipEntry=new ZipEntry(basePath + System.getProperties().getProperty("file.separator"));
    zipEntry.setUnixMode(755);//解决linux乱码
     
    如果是文件,则 
    ZipEntry zipEntry=new ZipEntry(base);
    zipEntry.setUnixMode(644);//解决linux乱码
     
    然后在输出时强制设置编码: 
     ZipOutputStream out = new ZipOutputStream(new FileOutputStream(
                    zipFileName));
            out.setEncoding("GBK");//解决linux乱码
     
    全部代码如下: 
     
     
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.OutputStream;
     
    import org.apache.tools.zip.ZipEntry;
    import org.apache.tools.zip.ZipOutputStream;
     
    import org.apache.tools.ant.Project;  
     
    import org.apache.tools.ant.taskdefs.Expand;
     
    /**
     * 文件夹压缩,支持win和linux
     * @author wlzhang
     *
     */
    public class ZipUtil
    {
        /**
         * @param inputFileName
         *            输入一个文件夹
         * @param zipFileName
         *            输出一个压缩文件夹,打包后文件名字
         * @throws Exception
         */
        public static OutputStream zip(String inputFileName, String zipFileName) throws Exception
        {
            return zip(zipFileName, new File(inputFileName));
        }
     
        private static OutputStream zip(String zipFileName, File inputFile) throws Exception
        {
            ZipOutputStream out = new ZipOutputStream(new FileOutputStream(
                    zipFileName));
            out.setEncoding("UTF-8");//解决linux乱码  根据linux系统的实际编码设置,可以使用命令 vi/etc/sysconfig/i18n 查看linux的系统编码
            zip(out, inputFile, "");
            out.close();
            return out;
        }
     
        private static void zip(ZipOutputStream out, File f, String base) throws Exception
        {
            if (f.isDirectory())
            { // 判断是否为目录
                File[] fl = f.listFiles();
                // out.putNextEntry(new org.apache.tools.zip.ZipEntry(base + "/"));
    //            out.putNextEntry(new ZipEntry(base + "/"));
                ZipEntry zipEntry=new ZipEntry(base + System.getProperties().getProperty("file.separator"));
                zipEntry.setUnixMode(755);//解决linux乱码
                out.putNextEntry(zipEntry);
    //            base = base.length() == 0 ? "" : base + "/";
                base = base.length() == 0 ? "" : base + System.getProperties().getProperty("file.separator");
                for (int i = 0; i < fl.length; i++)
                {
                    zip(out, fl[i], base + fl[i].getName());
                }
            }
            else
            { // 压缩目录中的所有文件
                // out.putNextEntry(new org.apache.tools.zip.ZipEntry(base));
                ZipEntry zipEntry=new ZipEntry(base);
                zipEntry.setUnixMode(644);//解决linux乱码
                out.putNextEntry(zipEntry);
                FileInputStream in = new FileInputStream(f);
                int b;
                while ((b = in.read()) != -1)
                {
                    out.write(b);
                }
                in.close();
            }
        }
     
        private static void unzip(String sourceZip,String destDir) throws Exception{  
     
            try{  
     
                Project p = new Project();  
     
                Expand e = new Expand();  
     
                e.setProject(p);  
     
                e.setSrc(new File(sourceZip));  
     
                e.setOverwrite(false);  
     
                e.setDest(new File(destDir));  
     
                /* 
     
                ant下的zip工具默认压缩编码为UTF-8编码, 
     
                而winRAR软件压缩是用的windows默认的GBK或者GB2312编码 
                所以解压缩时要制定编码格式 
                */ 
                e.setEncoding("UTF-8");  //根据linux系统的实际编码设置
                e.execute();  
            }catch(Exception e){  
                throw e;  
            }  
        }  
    
    }
    复制代码

     

  • 相关阅读:
    Linux学习32
    Linux学习31-如何查看 linux 系统是centos还是ubuntu,并查看系统版本号
    python测试开发django-124.bootstrap点删除按钮弹确认删除
    python测试开发django-123.bootstrap模态框(modal)垂直居中显示
    python测试开发django-122.bootstrap模态框(modal)学习
    Linux下查询tomcat进程命令
    linux服务器通过X11实现图形化界面显示 1 背景描述
    linux(centos)配置ipv6网卡
    linux 下给网卡添加ipv6、路由
    2021年最新大厂php+go面试题集(1)
  • 原文地址:https://www.cnblogs.com/timssd/p/4799844.html
Copyright © 2020-2023  润新知