Windows上创建的文件,上传到Linux服务器,文件名乱码?

系统 Linux
先来说一下问题,在 Windows 下创建的一系列文件,上传到 Linux 服务器后,出现文件名乱码,导致文件无法读取的情况。

事情的起因是这样的...

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

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

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

Tomcat:

catalina.sh中添加:export LANG=zh_CN.UTF-8

Linux 服务器编码:

vi /etc/sysconfig/i18n
LANG="zh_CN.UTF-8"

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

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

使用 convmv 将文件名转码

将文件名称转码,需要用到 convmv,这是一个转码工具。

在线安装 convmv

Linux中安装命令如下:

yum install convmv

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

使用程序包安装步骤

1).下载

下载地址为:​​https://pkgs.org/download/convmv​

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

找到下载地址:

2).安装

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

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

使用 convmv 对中文文件名进行转码

安装完 convmv 之后,就可使用 convmv 转码中文文件名了。为了操作方便,可写一个shell脚本,将文件名称转码:

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

上述命令,是将 /opt/ftp 路径下的所有文件名,都统一转码为utf8。

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

在 Java Web 工程中应用的时候,每次有新文件上传,就手动执行一下上述shell脚本,显然是不现实的,所以最简单的方法,就是使用 Java 调用 shell 脚本,让其自动转码。

Java 调用 shell 脚本的代码如下:

List();
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
相关推荐

2019-07-03 14:26:10

Linux服务器方法

2009-06-29 09:57:05

Unix

2017-03-02 11:58:31

NodeJS服务器

2009-03-11 09:28:18

文件名乱码下载浏览器PHP

2018-03-28 17:51:24

LinuxUnix

2022-03-01 20:33:50

服务web项目

2021-03-09 09:35:09

鸿蒙HarmonyOS应用开发

2012-12-24 15:00:56

sis塞班

2021-06-28 11:30:39

PythonWindows反斜杠

2016-11-18 15:08:54

linux服务器策略

2020-12-02 11:48:05

TFTP

2019-12-20 09:50:42

Windows 10文件Google

2015-10-09 09:41:24

HTTP网络协议文件传输

2015-09-28 13:39:13

Http网络协议HTTP

2015-10-10 16:46:14

HTTP网络协议文件传输

2015-10-08 09:38:24

HTTP网络协议文件传输

2015-09-29 09:25:20

HTTP网络协议

2011-03-25 15:01:25

Cacti监控Windows

2011-03-31 12:48:04

cactiLinuxWindows

2010-06-23 16:14:52

Linux Bash
点赞
收藏

51CTO技术栈公众号