红联Linux门户
Linux帮助

LINUX下tomcat的jvm编码修改

发布时间:2017-07-01 10:34:27来源:linux网站作者:ws379374000
申请了一台腾讯云服务器,系统centos7,将jforum论坛移植过去,论坛在阿里云的其他两台服务器运行正常,搬到这台服务器巨出现了各种问题,一一记录一下供以后参考:
 
jforum用的是freemarker,里面的中文都是读取的配置文件,但是有部分写死的汉字,显示为黑色菱形问号乱码,
先是查看系统语言,locale,
[root@VM_39_230_centos bin]# locale
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=Zn_CN.UTF-8
LC_CTYPE="Zn_CN.UTF-8"
LC_NUMERIC="Zn_CN.UTF-8"
LC_TIME="Zn_CN.UTF-8"
LC_COLLATE="Zn_CN.UTF-8"
LC_MONETARY="Zn_CN.UTF-8"
LC_MESSAGES="Zn_CN.UTF-8"
LC_PAPER="Zn_CN.UTF-8"
LC_NAME="Zn_CN.UTF-8"
LC_ADDRESS="Zn_CN.UTF-8"
LC_TELEPHONE="Zn_CN.UTF-8"
LC_MEASUREMENT="Zn_CN.UTF-8"
LC_IDENTIFICATION="Zn_CN.UTF-8"
LC_ALL=
LANG="zh_CN.UTF-8"
[root@VM_39_230_centos bin]# 
 
之前系统语言不是zh_CN.UTF-8,导致vi或者cat带汉字的文件是汉字显示乱码,改为zh_CN.UTF-8解决此问题
具体方法在
/etc/sysconfig/i18n
中加入
[root@VM_39_230_centos bin]# cat /etc/sysconfig/i18n
LANG="zh_CN.UTF-8"
 
之前都不是Zn_CN.UTF-8,导致vi文件时汉字乱码,文件编码为utf-8,但页面乱码应该不是这个问题导致,这个修复了vi或者cat文件时汉字显示乱码
[root@VM_39_230_centos bin]# cat /etc/sysconfig/i18n
在/etc/sysconfig/i18n加入以上解决
 
尝试设置
为了使Tomcat支持中文文件名并且让Tomcat能够自己处理Get方式传递过来的参数,那么我们已经在Tomcat安装目录下的conf/server.xml里头修改如下:
<Connectorport="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8"/>
并没什么用。
之后对三个服务器执行以下代码
System.getProperty("file.encoding")
System.out.println("Default Charset=" + Charset.defaultCharset());
System.out.println("file.encoding=" + System.getProperty("file.encoding"));
System.out.println("Default Charset=" + Charset.defaultCharset());
System.out.println("Default Charset in Use=" + getDefaultCharSet());
测试后发现两个服务器都是utf-8,腾讯的是其他,导致htm模板里面写死的中文乱码,
可以通过代码确认当前jvm运行的编码
 
eclipse中Tomcat启动信息中有
七月 1, 2017 9:50:17 上午 org.apache.catalina.startup.VersionLoggerListener log
信息: Command line argument: -Dfile.encoding=UTF-8;
此参数是在jvm启动的时候就已经设置完成。如果没有手动设置file.encoding,会根据当前系统的编码指定。 
如果在Windows下,file.encoding=”GBK”, 
如果在Linux下,file.encoding=”UTF-8”。 
注意:在Tomcat启动完成后,在程序中通过设置system property的方式是没有效果的,原因是jvm启动时读取file.encoding并cache,后续只使用启动时读取的编码。
修改jvm编码
linux环境
在catalina.sh配置
加一行
JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=utf-8"
JVM的缺省编码方式由系统的“本地语言环境Locale”设置确定。JVM的file.encoding属性,这个属性确定了JVM的缺省的编码/解码方式:从而影响应用中所有字节流==>字符流的解码方式 ,字符流==>字节流的编码方式。JVM会根据操作系统的Locale设置自动调整语言环境。基本不用设置。
用eclipse启动会看到
信息: Command line argument: -Dcatalina.base=E:\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0
有-Dfile.encoding=UTF-8
这一行,是jvm的默认编码,在项目中指定编码应该也可以解决该问题
例如:
BufferedReader in =newBufferedReader((newInputStreamReader(newFileInputStream(path.toString()),"utf-8")));
这里我修改了tomcat中jvm启动默认编码
 
查看jvm编码
可以通过代码确认当前jvm运行的编码
System.getProperty("file.encoding")
1
1
此参数是在jvm启动的时候就已经设置完成。如果没有手动设置file.encoding,会根据当前系统的编码指定。
如果在Windows下,file.encoding=”GBK”,
如果在Linux下,file.encoding=”UTF-8”。
注意:在Tomcat启动完成后,在程序中通过设置system property的方式是没有效果的,原因是jvm启动时读取file.encoding并cache,后续只使用启动时读取的编码。
 
修改jvm编码
Linux环境
在catalina.sh配置
JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=utf-8"
然后运行测试代码
结果网站出现Default Charset=UTF-8 file.encoding=utf-8 Default Charset=UTF-8
jvm编码已经改过来,看网站乱码汉字也已经正常显示.
这编辑器真是难用啊,第一次用!
 
本文永久更新地址:http://www.linuxdiyf.com/linux/31813.html