Java读取linux系统中文文件名时候乱码,并显示文件不存在

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java读取linux系统中文文件名时候乱码,并显示文件不存在相关的知识,希望对你有一定的参考价值。

使用ava.io.File f = new java.io.File("/home/multiverse/Repository/PMEPGImport")的方式读取文件,如文件名称含有中文,则读取结果文件名称中文部分乱码,且显示文件不存在。
我试过设置:
System.setProperty("file.encoding","GBK");
System.setProperty("sun.jnu.encoding","GBK");
不起作用;
试过将文件名称进行如下转码:
String s0= new String(S.getBytes("UTF-8"),"GB2312");
String s1= new String(S.getBytes("GB2312"),"UTF-8");
String s2= new String(S.getBytes("ISO-8859-1"),"UTF-8");
String s3= new String(S.getBytes("UTF-8"),"ISO-8859-1");
String s4= new String(S.getBytes("ISO-8859-1"),"GB2312");
String s88= new String(S.getBytes("GBK"),"GB2312");
String s89= new String(S.getBytes("GB2312"),"GBK");
String s5= new String(S.getBytes("GB2312"),"ISO-8859-1");
String s6= new String(S.getBytes("GBK"),"UTF-8");
String s7= new String(S.getBytes("UTF-8"),"GBK");
String s8= new String(S.getBytes("GBK"),"ISO-8859-1");
String s9= new String(S.getBytes("ISO-8859-1"),"GBK");
都不起作用;
试过对tomcat的server.xml进行设置如下:
<Connector port=”8080″ protocol=”HTTP/1.1″ connectionTimeout=”20000″ redirectPort=”8443″ URIEncoding=”utf-8″ useBodyEncodingForURI=”true”/>
也不起作用;
还有试着将Linux的默认编码格式为中文,修改/etc/sysconfig/i18n里的编码格式,也是不起作用。

我上网问询,研究了1个多星期,实在是找不出解决办法,
今天部门老大提醒我从java代码new java.io.File()过程,或者file.listFiles()的过程,深度刨析其源码的方式寻找解决办法,我还没有做。
问题终于解决了,现在把方案共享一下:
解决此问题分两步
第一步,保证文件存到Linux磁盘上,文件名的编码格式是UTF-8。
使用“\\IP”方式访问Linux服务器,并上传文件是经过samba协议的,而samba协议默认的编码格式是“GB2312”,所以每次我们通过“\\IP”方式向linux服务器放文件的时候,文件名存在磁盘上就已经乱码了。所以要修改samba协议编码格式。方法是:
修改/etc/samba/smb.conf 文件为以下内容:
dos charset = GB2312
unix charset = UTF-8
display charset = UTF-8
修改完后重起samba服务。

第二步,保证tomcat服务器的编码格式是UTF-8。
通过在catalina.sh 启动脚本里加入
export LANG=zh_CN.UTF-8
重启tomcat就可以了。

参考技术A 我记得InputStreamReader和OutputStreamWriter不是可以设置编码的吗?
方式应该是:OutputStreamWriter writer = new OutputStreamWriter(fop, "UTF-8");
InputStreamReader reader = new InputStreamReader(fip, "UTF-8");
这样还乱码?那就二进制读取就行了。
记得保证整个编译环境编码统一。追问

我们用的是File和FileInputStream,没有办法指定编码格式。
我们统一编码格式的做法是在catalina.sh里加入CATALINA_OPTS="-Dfile.encoding=UTF-8",这样file的编码格式就为UTF-8了。
现在怀疑是Linux系统没有安装中文语言包,造成乱码,还在验证中!

参考技术B 同学,这个很麻烦的,大哥解决方案就是存文件加码,取文件解码。用base64这个东西,你可以百度一下。然后在linux下就不存在有中文文件了。追问

我们文件是手动放上去的,很难避免文件名中文的情况。

参考技术C 由于字符编码不一致,导致乱码,从而导致文件不存在。
1,Linux字符编码一般都为utf-8。

2,编写java代码设置字符编码为utf-8。
参考技术D 亲,你的linux系统是是什么?ubuntu?可以加你qq吗?我也遇到了同样的问题。

linux系统如何更改字符集的支持,解决Linux中文显示乱码使centos显示中文

linux系统如何更改字符集的支持


怎么设置Linux系统中文语言,这是很多小伙伴在开始使用Linux的时候,都会遇到一个问题,就是终端输入命令回显的时候中文显示乱码。出现这个情况一般是由于没有安装中文语言包,或者设置的默认语言有问题导致的。咗嚛本经验以centos为例,操作Linux怎么查看语言,设置修改语言

主要是更改/etc/locale.conf文件。centos7之前的版本的配置文件为:/etc/sysconfig/i18n

查看当前系统语言

登陆linux系统打开操作终端之后,输入 echo $LANG可以查看当前使用的系统语言。如

技术分享

查看安装的语言包

查看是否有中文语言包可以在终端输入 locale命令,如有zh cn 表示已经安装了中文语言

技术分享

如果没有中文语言呢

  可以通过网上下载安装中文语言包yum groupinstall chinese-support(不能联网的通过其他电脑下载,上传上去吧)

 技术分享

如何修改系统语言为中文

1 临时更换语言

如果只是临时更换linux系统的语言环境,可以通过输入设置 LANG=语言名称, 如中文是 

Zn_CN.UTF-8(注意我这里本来就是中文的,我临时设置为英文

 技术分享

修改系统默认语言

以上方法是通过修改设置系统默认的语言配置

Vi  /etc/locale.conf(注意:执行source /etc/locale.conf或者之后重启一下系统)

技术分享

其他注意事项

如果按照以上方法设置修改设置中文语言还是不行的话,注意您的链接终端选择的编码。

xshell为例,把终端的编码选择中文,或者UTF8即可

技术分享


本文出自 “挚爱Linux” 博客,请务必保留此出处http://mpflinux.blog.51cto.com/12173924/1946157

以上是关于Java读取linux系统中文文件名时候乱码,并显示文件不存在的主要内容,如果未能解决你的问题,请参考以下文章

java写的excel文件转csv文件脚本遇到中文就会乱码

java在linux系统下文件夹出现中文乱码的问题

node读取本地文件中文乱码

Java IO读取txt文件乱码。前提不知道文档是啥编码格式

java 读取文件流乱码输出乱码

python输出中文乱码