Java读取linux系统中文文件名时候乱码

swany 2014-02-17 06:15:30
使用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()的过程,深度刨析其源码的方式寻找解决办法,我还没有做。
这种情况想必不少人都遇见过,都出来讨论下,分析下,或者直接给出解决办法。各位大虾们都出来帮帮小妹呀!
...全文
8323 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
wol003 2014-06-15
  • 打赏
  • 举报
回复
遇到同类问题,明天上班的时候试试,先谢了
ooohiooo 2014-04-10
  • 打赏
  • 举报
回复
我也越到同样的问题,不知道如何解决,楼主能说得详细点吗?
swany 2014-03-17
  • 打赏
  • 举报
回复
问题终于解决了,现在把方案共享一下: 解决此问题分两步 第一步,保证文件存到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就可以了。
swany 2014-03-10
  • 打赏
  • 举报
回复
引用 12 楼 miliermili 的回复:
字符集编码没有统一
大侠能说明的详细点吗,字符集如何统一。不知道我上面列出的步奏有没有把字符集统一。
steforward 2014-03-09
  • 打赏
  • 举报
回复
读取内容没乱码,读文件名发生乱码,试下以下方法。 你的文件名是写在JSP内,你以哪种字符集保存的文件就把JSP页面的字符编码设成哪种。然后在tomcat的server.xml的connector项加入URIEncoding="保存文件的字符集″,测试下是否ok
miliermili 2014-03-09
  • 打赏
  • 举报
回复
字符集编码没有统一
swany 2014-03-07
  • 打赏
  • 举报
回复
引用 6 楼 u013825218 的回复:
[quote=引用 5 楼 u012463264 的回复:] 这个乱码 你怎么知道是乱码? 我觉得你这个和你读文件是没关系的, 是你在输出的时候要转码。 Writer out = new OutputStreamWriter(outputStream, "utf-8"); 输出到文件中看看乱码吗 你要是转成字符串,要先转成字节数组,之后转码 new ByteArrayOutputStream();
兄台高见啊! Linux系统的默认字符集是utf-8,都是以3个字节共24位保存中文,读取文件必须是以utf-8的字符集读取,如

FileInputStream fis = new FileInputStream("fileName");
InputStreamReader isr = new InputStreamReader(fis,"utf-8");
个人见解,不对的地方各位大神指点下[/quote] 能把你的代码例子再贴全面一点吗,我读取文件内容不乱码,而是读取文件名乱码。代码如下: java.io.File f = new java.io.File("/home/multiverse/Repository/PMEPGImport"); for (java.io.File s : f.listFiles()) { out.println(s.getName()); out.println(s.exists()+"<br/>"); } 以上上写在JSP文件里的Java代码,结果是文件名乱码,文件不存在。 还有我在centos5.3,5.4上测试都不会乱码,在centos6.3上测试就是乱码。 期待高手继续指点。
swany 2014-03-07
  • 打赏
  • 举报
回复
引用 5 楼 u012463264 的回复:
这个乱码 你怎么知道是乱码? 我觉得你这个和你读文件是没关系的, 是你在输出的时候要转码。 Writer out = new OutputStreamWriter(outputStream, "utf-8"); 输出到文件中看看乱码吗 你要是转成字符串,要先转成字节数组,之后转码 new ByteArrayOutputStream();
多谢指点,但是我读取文件内容不乱码,而是读取文件名乱码。代码如下: java.io.File f = new java.io.File("/home/multiverse/Repository/PMEPGImport"); for (java.io.File s : f.listFiles()) { out.println(s.getName()); out.println(s.exists()+"<br/>"); } 以上上写在JSP文件里的Java代码,结果是文件名乱码,文件不存在。 还有我在centos5.3,5.4上测试都不会乱码,在centos6.3上测试就是乱码。 期待高手继续指点。
swany 2014-03-07
  • 打赏
  • 举报
回复
引用 4 楼 defonds 的回复:
肯定是字符集编码不一致了
大侠,能说的详细一点吗,我做过很多同一字符集的实验都不行啊。问题不是读文件内容乱码,而是读取文件名乱码。
别闹腰不好 2014-03-07
  • 打赏
  • 举报
回复
new java.io.File("/home/multiverse/Repository/PMEPGImport/URLEncoder.encode("中文名",平台编码方式)") 平台编码方式 就看你的平台的编码是什么了 比如 utf-8或 GBK
steforward 2014-03-01
  • 打赏
  • 举报
回复
引用 5 楼 u012463264 的回复:
这个乱码 你怎么知道是乱码? 我觉得你这个和你读文件是没关系的, 是你在输出的时候要转码。 Writer out = new OutputStreamWriter(outputStream, "utf-8"); 输出到文件中看看乱码吗 你要是转成字符串,要先转成字节数组,之后转码 new ByteArrayOutputStream();
兄台高见啊! Linux系统的默认字符集是utf-8,都是以3个字节共24位保存中文,读取文件必须是以utf-8的字符集读取,如

FileInputStream fis = new FileInputStream("fileName");
InputStreamReader isr = new InputStreamReader(fis,"utf-8");
个人见解,不对的地方各位大神指点下
别闹腰不好 2014-02-28
  • 打赏
  • 举报
回复
这个乱码 你怎么知道是乱码? 我觉得你这个和你读文件是没关系的, 是你在输出的时候要转码。 Writer out = new OutputStreamWriter(outputStream, "utf-8"); 输出到文件中看看乱码吗 你要是转成字符串,要先转成字节数组,之后转码 new ByteArrayOutputStream();
Defonds 2014-02-28
  • 打赏
  • 举报
回复
肯定是字符集编码不一致了
_serendipity_ 2014-02-27
  • 打赏
  • 举报
回复
1、先设置Linux的默认字符编码为UTF-8. 2、然后查看一下文件名是正常显示中文还是乱码。如果是乱码,则需要对文件重新命名;如果正常,则在Java里读取应该不会有问题。 3、跟Linux没有安装语言包应该没什么关系。不过要想看到第2步的中文文件名,登录的终端需要设置支持中文的字体,且编码为UTF-8。
swany 2014-02-19
  • 打赏
  • 举报
回复
我使用 rpm -qa |grep fonts 发现Linux系统没有安装任何语言包。 现在怀疑是Linux系统没有安装中文语言包,造成乱码,还在验证中! 怎么这么冷清啊,各位大哥出来帮帮小妹呀!
安心逍遥 2014-02-18
  • 打赏
  • 举报
回复
Linux 统一 UTF-8,如果你的应用环境不是 UTF-8需要自己转换。

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧