我遇到一个问题,CKFinder后台获取到的文件名是问号。
肯定是编码问题。
第一步,修改jdk编码
(目标读取到正确的文件名称。验证方法输出文件名到日志文件,下载日志到本地确定不乱码)
解决方法tomcat bin目录下新增:
setenv.sh
export JAVA_OPTS="-server -Dsun.jnu.encoding=UTF-8 -Dfile.encoding=UTF-8"
默认情况下,得到系统编码(Ubuntu openjdk):
# java -jar sysProp.jar | grep encoding file.encoding.pkg: sun.io sun.jnu.encoding: ANSI_X3.4-1968 file.encoding: ANSI_X3.4-1968 sun.io.unicode.encoding: UnicodeLittle
加上虚拟机参数后:
# java -Dsun.jnu.encoding=UTF-8 -Dfile.encoding=UTF-8 -jar sysProp.jar | grep encoding file.encoding.pkg: sun.io sun.jnu.encoding: UTF-8 file.encoding: UTF-8 sun.io.unicode.encoding: UnicodeLittle
编码解释:
- sun.jnu.encoding 影响文件名
- file.encoding 影响文件内容
附录sysProp.jar 的代码:
package pp.Main; import java.io.File; import java.io.IOException; import java.util.Iterator; import java.util.Properties; public class Main { public static void main(String[] args) throws IOException { Properties p = System.getProperties(); Iterator<Object> keys = p.keySet().iterator(); while(keys.hasNext()){ String key=keys.next().toString(); System.out.println(key+": "+System.getProperty(key)); } String name="newfile_新文件"; System.out.println(name); File f=new File(name); if(f.exists()){ f.delete(); } f.createNewFile(); } }
设置好后,CKFinder得到的文件名在日志里显示正常,设置之前是问号。但是文件名称还是问号。
第二步,修改操作系统的编码。
(目标sysProp.jar新建的文件名能够正确显示 )
设置字符编码 vi /etc/environment 添加下面两行
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games" LANG="zh_CN.UTF-8" LANGUAGE="zh_CN:zh:en_US:en"关键的一步:使用locale-gen命令添加中文字符编码(命令执行后需要耐心等待几分钟)。
#locale-gen zh_CN.UTF-8执行成功后,重启 执行java -Dsun.jnu.encoding=UTF-8 -Dfile.encoding=UTF-8 -jar sysProp.jar 然后ls 将正确看到中文显示。
.... sun.cpu.isalist: newfile_新文件 root@ippcom:~# ls index.html newfile_新文件 sysProp.jar
注意一定要用支持UTF-8的ssh客户端,例如putty
参考
http://kang36897.blog.163.com/blog/static/17047373201331111224630/
http://blog.csdn.net/cuker919/article/details/8233821
http://www.linuxidc.com/Linux/2014-02/96939.htm