6

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

 1 year ago
source link: https://www.51cto.com/article/722463.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

作者:刘光录 2022-11-10 15:17:43
先来说一下问题,在 Windows 下创建的一系列文件,上传到 Linux 服务器后,出现文件名乱码,导致文件无法读取的情况。
417a98d06ddaefe93bd4587d0c9e9de3bcec30.jpg

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

最近有这样一个需求:在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​

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

98d75618030e774c2be952aee9c5169ea6ad44.jpg

找到下载地址:

d1bfc4833e00b35d610663df869e7093402d83.jpg

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

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK