我遇到一个问题,CKFinder后台获取到的文件名是问号。
肯定是编码问题。
第一步,修改jdk编码
(目标读取到正确的文件名称。验证方法输出文件名到日志文件,下载日志到本地确定不乱码)
解决方法tomcat bin目录下新增:
setenv.sh
Java代码
- export JAVA_OPTS="-server -Dsun.jnu.encoding=UTF-8 -Dfile.encoding=UTF-8"
默认情况下,得到系统编码(Ubuntu openjdk):
Java代码
- # 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代码
- # 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 的代码:
Java代码
- 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 添加下面两行
Java代码
- 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命令添加中文字符编码(命令执行后需要耐心等待几分钟)。
Java代码
- #locale-gen zh_CN.UTF-8
执行成功后,重启
执行java -Dsun.jnu.encoding=UTF-8 -Dfile.encoding=UTF-8 -jar sysProp.jar
然后ls 将正确看到中文显示。
Java代码
- ....
- 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