为什么80%的码农都做不了架构师?>>>
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进程所有参数变量;