Mar 22, 2018 12:22:22 AM

作者:

乱码的根源

源编码与目标编码的不一致. 而中文window系统默认编码GBK,害惨了多少程序员.

要尽量减少出现乱码,我个人认为要做到5码合一, IDE(Eclipse/idea),页面(jsp/其他模板引擎),应用服务器(tomcat等),源码(Java源码及周边文件),数据库编码.

将Eclipse设置为UTF-8

打开Eclipse安装目录下的eclipse.ini,在最末尾新增一行

修改之后的,重启eclipse即可.

JSP页面编码

tomcat编码

  1. set JAVA_OPTS=-Dfile.encoding=UTF-8

打开conf\server.xml, 在8080端口所属的Connector节点,添加URIEncoding,可解决大部分GET请求中文乱码的问题

源码的编码

通常情况下, 文件本身的编码,取决于新建文件时,IDE或Project的编码.

另外一个隐藏的编码,是maven/ant编译java源文件时使用的编码

maven的配置如下

  1. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

数据库编码

通常来说,如果其他4码解决了,那大部分情况下是mysql会出现编码问题

mysql有4个编码

  1. Server characterset: utf8 // 服务器字节集
  2. Client characterset: utf8 // 客户端字节集
  3. Conn. characterset: utf8 // 当前连接的字节集

然而,对于现有系统,全局修改的风险比较大,所以,可以在客户端解决,即jdbcurl上做配置

  1. jdbc:mysql://127.0.0.1/nutzdemo?useUnicode=true&characterEncoding=UTF-8

Nutz的相关日志

nutz在启动时也会打印周围的编码信息,帮助排查.

  1. 21:22:23.235 INFO (NutLoading.java:56) load - Nutz.Mvc[nutz] is initializing ...
  2. 21:22:23.235 DEBUG (NutLoading.java:60) load - Web Container Information:
  3. 21:22:23.237 DEBUG (NutLoading.java:61) load - - Default Charset : UTF-8
  4. 21:22:23.237 DEBUG (NutLoading.java:62) load - - Current . path : D:\nutzbook\eclipse\.
  5. 21:22:23.237 DEBUG (NutLoading.java:63) load - - Java Version : 1.8.0_112
  6. 21:22:23.237 DEBUG (NutLoading.java:65) load - - Timezone : Asia/Shanghai
  7. 21:22:23.238 DEBUG (NutLoading.java:67) load - - ServerInfo : Apache Tomcat/9.0.0.M13
  8. 21:22:23.238 DEBUG (NutLoading.java:68) load - - Servlet API : 4.0
  9. 21:22:25.134 DEBUG (DaoSupport.java:199) invoke - JDBC Name --> MySQL Connector Java
  10. 21:22:25.135 DEBUG (DaoSupport.java:201) invoke - JDBC URL --> jdbc:mysql://127.0.0.1:3306/nutzbook
  11. 21:22:25.145 DEBUG (MysqlJdbcExpert.java:212) checkDataSource - Mysql : character_set_client=utf8
  12. 21:22:25.146 DEBUG (MysqlJdbcExpert.java:212) checkDataSource - Mysql : character_set_connection=utf8
  13. 21:22:25.146 DEBUG (MysqlJdbcExpert.java:212) checkDataSource - Mysql : character_set_database=utf8
  14. 21:22:25.146 DEBUG (MysqlJdbcExpert.java:212) checkDataSource - Mysql : character_set_filesystem=binary
  15. 21:22:25.146 DEBUG (MysqlJdbcExpert.java:212) checkDataSource - Mysql : character_set_results=
  16. 21:22:25.147 DEBUG (MysqlJdbcExpert.java:212) checkDataSource - Mysql : character_set_system=utf8

Default Charset的编码,在Eclipse环境内, 通过eclipse.ini调整,在tomcat内的话,通过setenv.bat调整.

mysql的编码,通过修改my.ini或jdbc url进行调整

本页面的文字允许在和GNU自由文档许可证下修改和再使用。