环境/框架:windows7+Intellij Idea+jdk8+tomcat+Spring
起因:写微信支付接口时遇到过很多编码错误问题,比如:
1. 收到了微信返回、console里打印出来错误描述是“???mchid???appid???”
2. 返回给设备端的出错描述,postman里看到是“JSON???????”
3. 另外这里提到的签名checksum计算错误
目的:使代码开发、程序运行和读写http消息时都使用UTF-8编码
Disclaimer:只是整理自己遇到且试过的(没有数据库、html页面相关)。解决思路和大部分代码来源都是StackOverflow(感谢SO答主)。一些能原帖链接已经附上、其他用英文google应该都能找到。
Checklist:
IDEA settings -> file encodings 都设成UTF-8,目的:将项目源文件都以UTF-8保存。
[optional] 修改IDEA bin/目录下的idea.exe.vmoptions/idea64.exe.vmoptions文件 或通过Help菜单的Edit Custom VM Options、增加
-Dfile.encoding=UTF8
参数,目的:使IDE在UTF-8下运行。
(仔细想了想其实说不出这个有什么具体作用…但因为遇到过console打印乱码问题,为了限制/缩小排查范围就加上了。)
以上参考intellij-idea-incorrect-encoding-in-console-output设置maven或gradle编译选项,具体参考:
Maven文档
how-to-configure-encoding-in-maven
show-utf-8-text-properly-in-gradle
目的:保证生成的class文件(特别是其中的static String)都使用utf8编码。配置tomcat。用到的是
(1)jvm_opts增加-Dfile.encoding=UTF8
(可以修改catalina.bat或Intellij的run configuration),目的:保证在运行各webapp时用UTF8而不是系统默认编码(开头提到的checksum问题)。
(2)server.xml里<Connector>
增加属性URIEncoding="UTF-8"
,目的:保证GET方法的url(及query string)使用utf8解析。
两个非常详细的参考:
Tomcat FAQ CharactorEncoding (里面的