- 主题:请教中文文件名在程序里读不到的解决方案
linux服务器,服务器的lang,lc_all都是设置的是en_us.utf8。本地文件名应该是utf8编码(是另外tomcat程序通过用户上传保存下来).
现在机器上有另外一个java程序,启动的时候,
sh 脚本里会设置export Lang=gbk,java启动参数设置-Dfile.encoding=gbk。现在导致用File file=new File(filePath)报找不到文件。
如果把启动参数里的export Lang=gbk去掉就可以读到文件了。
由于是老程序,工程又很大,不敢把sh里的export Lang=gbk给去掉,希望想通过对filePath做一些编码处理看能不能读到,但都不成功。
java程序里对目录用listFile来拿到File实例,再拿到文件名进行打印
服务器上的文件名
String fileName = file.getFileName();
String fileName1 = new String(fileName.getBytes("GBK"), "UTF8"));
String fileName2 = new String(fileName.getBytes(), "UTF8"));
String fileName3 = new String(fileName.getBytes(), "GBK"));
String fileName4 = new String(fileName.getBytes("UTF8"), "GBK"));
其中fileName1和fileName2基本正常(有个字“书”却变成??)其他都是乱码。
如果用文件路径(文件路径是从数据库读回来的),下面几种尝试都不成功
File file1 = new File(new String(new String(filePath.getBytes(), "UTF-8").getBytes("UTF-8"), "GBK"));
logger.info(file1.getFileName() + file1.isExist())
File file2 = new File(new String(filePath.getBytes("UTF-8"), "GBK"));
logger.info(file2.getFileName() + file2.isExist())
File file3 = new File(new String(filePath.getBytes("GBK"), "UTF-8"));
logger.info(file3.getFileName() + file3.isExist())
File file4 = new File(new String(new String(filePath.getBytes(), "UTF-8").getBytes("GBK"), "GBK"));
logger.info(file4.getFileName() + file4.isExist())
求各位建议,非常感谢
发自「今日水木 on iPhone 8 Plus」
--
FROM 111.201.92.*
猜测:文件名是你的程序写入的,就算别人传的UTF8,你的代码也是写的GBK,所以linux里的文件名本身应该就有乱码。除非文件上传这块已经做了转码,比如拿到UTF-8的文件名转成GBK,再保存文件。
要不你先贴一下 ls 的内容?
--
FROM 121.69.4.*
服务器上文件名直接ssh客户端登录/sftp是可以正常显示的,是tomcat程序用utf8编码写入的。
【 在 woshidashu 的大作中提到: 】
:
: 猜测:文件名是你的程序写入的,就算别人传的UTF8,你的代码也是写的GBK,所以linux里的文件名本身应该就有乱码。除非文件上传这块已经做了转码,比如拿到UTF-8的文件名转成GBK,再保存文件。
:
: 要不你先贴一下 ls 的内容?
: --
: 飞天
:
发自「今日水木 on iPhone 8 Plus」
--
FROM 111.201.92.*
起一个中间服务取文件名, 旧项目通过接口去取呢?
【 在 thitech 的大作中提到: 】
: linux服务器,服务器的lang,lc_all都是设置的是en_us.utf8。本地文件名应该是utf8编码(是另外tomcat程序通过用户上传保存下来).
: 现在机器上有另外一个java程序,启动的时候,
: sh 脚本里会设置export Lang=gbk,java启动参数设置-Dfile.encoding=gbk。现在导致用File file=new File(filePath)报找不到文件。
: ...................
--
FROM 223.72.56.*
这是一个方法,本想要个直接的方式
【 在 Mikov 的大作中提到: 】
:
: 起一个中间服务取文件名, 旧项目通过接口去取呢?
: --
:
发自「今日水木 on iPhone 8 Plus」
--
FROM 223.104.39.*
我觉得你首先要把读不读得到文件和显示是否乱码两个问题分开来,这两个没有必然联系。
【 在 thitech (酱油先生) 的大作中提到: 】
: linux服务器,服务器的lang,lc_all都是设置的是en_us.utf8。本地文件名应该是utf8编码(是另外tomcat程序通过用户上传保存下来).
: 现在机器上有另外一个java程序,启动的时候,
: sh 脚本里会设置export Lang=gbk,java启动参数设置-Dfile.encoding=gbk。现在导致用File file=new File(filePath)报找不到文件。
: ...................
--
FROM 114.86.225.*
根源是不能用EXPORT解决读文件乱码问题。
【 在 thitech (酱油先生) 的大作中提到: 】
: linux服务器,服务器的lang,lc_all都是设置的是en_us.utf8。本地文件名应该是utf8编码(是另外tomcat程序通过用户上传保存下来).
: 现在机器上有另外一个java程序,启动的时候,
: sh 脚本里会设置export Lang=gbk,java启动参数设置-Dfile.encoding=gbk。现在导致用File file=new File(filePath)报找不到文件。
: ...................
--
FROM 221.219.105.*
那你java干嘛非得用gbk encoding啊?都用utf8不简单吗?
否则真的很难解决。Linux文件系统不认识编码,你给它什么它就存什么。你utf8写入,就应该utf8读取。
换Windows可以解决这个问题。
【 在 thitech 的大作中提到: 】
: linux服务器,服务器的lang,lc_all都是设置的是en_us.utf8。本地文件名应该是utf8编码(是另外tomcat程序通过用户上传保存下来).
: 现在机器上有另外一个java程序,启动的时候,
: sh 脚本里会设置export Lang=gbk,java启动参数设置-Dfile.encoding=gbk。现在导致用File file=new File(filePath)报找不到文件。
: ...................
--
FROM 107.139.34.*
虽然java是unicode,但是java调用Linux系统API的时候必须把unicode字符串转换成本地编码(如utf8/gbk)。这时候它怎么知道该用什么编码呢?得你告诉它呀。
--
FROM 107.139.34.*
不是我想用gbk,是老工程设置的启动脚本,不知道why,导致不敢变动。
另外,我测试了下,
把文件名
string gbkfn = new string(file name.getbytes(),”utf8”)
然后跟目录listFiles里的File对象的名字比对,能相等,
但是new file(filepath + gbkfn)就是不存在,从listFiles里拿到的File对象也打不开流
【 在 thitech 的大作中提到: 】
: linux服务器,服务器的lang,lc\_all都是设置的是en\_us.utf8。本地文件名应该是utf8编码(是另外tomcat程序通过用户上传保存下来).
:
: 现在机器上有另外一个java程序,启动的时候,
: sh 脚本里会设置export Lang=gbk,java启动参
: ..................
发自「今日水木 on iPhone 8 Plus」
--
FROM 117.136.38.*