LINUX下tomcat的jvm编码修改

来源:互联网 发布:酒店营业数据分析 编辑:程序博客网 时间:2024/05/30 04:41

申请了一台腾讯云服务器,系统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/i18nLANG="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启动信息中有
六月 30, 2017 1: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编码已经改过来,看网站乱码汉字也已经正常显示.

这编辑器真是难用啊,第一次用!

原创粉丝点击