posts - 22, comments - 32, trackbacks - 0, articles - 71
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

JAVA 应用乱码终极篇

Posted on 2013-11-20 11:44 为自己代言 阅读(430) 评论(0)  编辑  收藏

JAVA 应用乱码终极篇

1: 大家有些时候为系统乱码而烦恼,近期有时间整理了下解决乱码问题:

   一个系统中关于设置编码地方很多: 数据库,项目,平台系统,容器等;
  
   关于应用:
   所有设置编码的地方到最后都得跟JVM 打交道,所以JVM把所有编码都先转换成unicode 码,然后输出时候在相反转换回去,这里是出现乱码根;
  
   例如:一个输入参数以GBK编码,JVM 编译时候  GBK--->unicode, 然后如果输出时候 unicode --->UTF-8(客户端编码) 就可能乱码;所以大家为了
      
        必免有乱码情况,所有都统一编码;
       
  
   以下Linux为例:
  
   JVM 启动参数可以设置有两地方(包括两设置编码属性),第一:全局/etc/profile 文件中 ,容器启动脚本中(tomcat catalina.sh)
  
   具体参数如下:
  
   JAVA_OPTS=" -server -Xms32m -Xmx512m -XX:MaxPermSize=256m -Djava.net.preferIPv4Stack=true -Djava.awt.headless=true -Dsun.net.client.defaultConnectTimeout=60000 -Dsun.net.client.defaultReadTimeout=60000 -Djmagick.systemclassloader=no -Djava.library.path=/usr/local/lib:$ORACLE_HOME/lib -Dnetworkaddress.cache.ttl=300 -Dsun.net.inetaddr.ttl=300 -Dfile.encoding=GBK";export JAVA_OPTS    
  
   其中file.encoding=GBK ----> JVM 编译参数时候按GBK编成转换成unicode;
  
      sun.jnu.encoding = UTF-8  --->JVM 编译源代码指定的编码(因为JAVA源码没有中文,所以一般不指定);
     
      这两参数可以手动设置:第一/etc/profile ,还可以在容器启动脚本中(tomcat catalina.sh)设置,
     
      如果/etc/profile设置了是所有JAVA进程生效;tomcat catalina.sh 只对某个容器JAVA进程生效(多实例部署时可能用到);
     
      如果两都设置,后者会覆盖前者;如果两者都不设置取profile 文件中设置,如果profile也不设置,找.bash_profile文件中设置, profile ,.bashprofile都不设置 ,取系统安装时候选择的编码;
      
      如果两者中有一者指定了JVM启动编码参数,JVM 不在参考系统编码设置(例profile,.bash_profile 文件中设置变量 export LANG="UTF-8");
     
     
      以上数据可以在Linux 用以下命令查询出来:
     
      ps -au |grep jd-movie //查询某个Linux帐户进程;
     
      jinfo 11229 //可以查看当前JVM进程所有参数变量;


只有注册用户登录后才能发表评论。


网站导航: