暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Linux下如何对gbk编码格式的文件名进行转码

TIAP 2021-08-24
1730

最近有这样一个需求:在Java Web工程中读取本地某一个文件夹(固定路径,写在配置文件中)下的所有文件,然后将其导入到系统中。最直接的方案就是使用java.io.File的listFiles方法列出这个文件夹中的所有文件,然后在做处理,开始也是这样做的。


在本地测试没有任何问题,但是一旦部署到生产环境(Linux系统环境),问题就来了:由于文件是通过FTP上传到固定文件夹中的,所以有一些中文名称的文件,在上传到Linux系统中后,就出现了乱码,程序也无法读取到。

于是开始检查tomcat编码、操作系统编码格式,都统一设置为UTF-8。


tomcat

catalina.sh中添加:export.UTF-8


linux

vi etc/sysconfig/i18n

LANG="zh_CN.UTF-8"


注:检查操作系统编码命令为 echo $LANG。查看操作系统语言命令:locale

统一编码后,问题依然存在。这时候才意识到,由于文件是在windows下生成的,默认编码都是gbk,所以需要将文件名称转码。

将文件名称转码,需要用到convmv,Linux中安装命令如下:

    yum install convmv


    如果系统没有联网,或者屏蔽了yum命令,可以先下载程序包,然后安装。


    安装步骤


    1)下载

    https://pkgs.org/download/convmv

    根据操作系统版本选择相应的版本下载:

    找到download连接:


    2)安装

    将文件拷贝到一个路径下(比如home),执行安装命令:

      sudo rpm -ivh convmv-1.15-2.el7.noarch.rpm


      安装完成之后,就写一个shell脚本,将文件名称转码:

        #!/bin/bash
        convmv -f gbk -t utf-8 -r –notest opt/ftp


        以上命令为将/opt/ftp下的所有文件都进行转码操作。

        这样中文名称的文件就能被程序读取到了。

        但是随后又有另外一个问题,不能每次上传文件后都要执行一下转码的脚本,所以需要在Java程序中运行这个转码命令(也可以执行bash脚本文件,或者写定时任务执行脚本文件),Java调用shell代码如下:

          List<String> commend = new ArrayList<String>();
          commend.add("convmv");
          commend.add("-f");
          commend.add("gbk");
          commend.add("-t");
          commend.add("utf-8");
          commend.add("-r");
          commend.add("–notest");
          commend.add("/opt/ftp");
          try{
          ProcessBuilder builder = new ProcessBuilder();
          builder.command(commend);
          Process proc = builder.start();
          proc.waitFor();
          }catch(Exception e){
          e.printStackTrace();
          }



          文章转载自TIAP,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

          评论