同样的代码,开发环境运行正常,部署到生产环境一般情况下(无论中文还是英文字母)页面也正常。当是在调用微信小程序的服务端接口发送模板消息到同微信开放平台下的微信公众号中时,生产环境调用接口发送消息出现中文乱,开发环境调试时又正常的。
1.开发环境
操作系统:win 10
开发工具:eclipse
项目文件编码(即*.java文件):utf-8
启动方式有两种方式:
① eclipse中运行JettyServer类的main方法启动嵌入式jetty
② 通过ant编译项目,然后打包成jar,最后通过java 命令运行JettyServer类的main方法启动嵌入式jetty。
<javac includeantruntime="false" source="1.8" target="1.8" srcdir="${basedir}/src" destdir="${basedir}/build/classes" encoding="UTF-8">
System.out.println(System.getProperties().get("file.encoding"));
结果:
① 通过eclipse运行调试时调用接口传的中文参数是正常的,file.encoding=UTF-8
② 通过java -jar 命令运行项目时,访问本地页面正常,但调用接口发送消息,中文乱码,file.encoding=GBK。
2.生产环境
操作系统:win 2008 r2
启动方式:通过java -jar 命令运行项目
结果:和开发环境一样,访问本地页面正常,但调用接口发送消息,中文乱码,file.encoding=GBK。
找到原因:
之前并不知道是由于file.encoding引起的,找了很多资料才发现是由于eclipse启动项目时file.encoding值自动与main方法所在java文件的编码格式一致。java -jar命令启动时,windows系统一般file.encoding为GBK,unix系统一般file.encoding为UTF-8.
解决办法:
在启动项目的start.bat文件中,添加参数-Dfile.encoding=UTF-8。这样就解决了调用接口传参中文乱码问题了。
chcp 65001
java -jar -Dfile.encoding=UTF-8 xpl.jar
@cmd.exe
关于chcp命令:
windows操作系统的cmd控制台默认编码方式为GBK。
使用chcp 65001命令,可以将编码方式改为UTF-8. 这个只在当前控制台窗口有效,关闭窗口后,会自动恢复为GBK。
之前file.encoding=GBK,生产环境控制台输出的日志信息中文是正常的,-Dfile.encoding=UTF-8后,中文乱码了。
所以要添加chcp 65001。
奇怪的是,我在开发环境下添加chcp 65001后启动项目,控制台输出日志中文正常,生产环境下控制台显示中文乱码。
不知道是不是win 2008 r2的原因。