编码与乱码

Mar 22, 2018 12:22:22 AM

作者:wendal

乱码的根源

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

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

将Eclipse设置为UTF-8

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

  1. -Dfile.encoding=UTF-8

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

JSP页面编码

  1. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>

tomcat编码

打开 tomcat安装目录下的 bin\setenv.bat ,该文件通常不存在,新建之, 添加如下内容

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

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

  1. URIEncoding="UTF-8"

源码的编码

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

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

maven的配置如下

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

数据库编码

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

mysql有4个编码

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

修改my.ini的mysqld小节,设置服务器字符集,是最佳解决方式

  1. [mysqld]
  2. character-set-server = 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:55) load - Nutz Version : 1.r.59
  2. 21:22:23.235 INFO (NutLoading.java:56) load - Nutz.Mvc[nutz] is initializing ...
  3. 21:22:23.235 DEBUG (NutLoading.java:60) load - Web Container Information:
  4. 21:22:23.237 DEBUG (NutLoading.java:61) load - - Default Charset : UTF-8
  5. 21:22:23.237 DEBUG (NutLoading.java:62) load - - Current . path : D:\nutzbook\eclipse\.
  6. 21:22:23.237 DEBUG (NutLoading.java:63) load - - Java Version : 1.8.0_112
  7. 21:22:23.237 DEBUG (NutLoading.java:65) load - - Timezone : Asia/Shanghai
  8. 21:22:23.238 DEBUG (NutLoading.java:66) load - - OS : Windows 7 amd64
  9. 21:22:23.238 DEBUG (NutLoading.java:67) load - - ServerInfo : Apache Tomcat/9.0.0.M13
  10. 21:22:23.238 DEBUG (NutLoading.java:68) load - - Servlet API : 4.0
  11. 21:22:23.238 DEBUG (NutLoading.java:73) load - - ContextPath : /nutzbook
  12. 21:22:25.134 DEBUG (DaoSupport.java:199) invoke - JDBC Name --> MySQL Connector Java
  13. 21:22:25.135 DEBUG (DaoSupport.java:201) invoke - JDBC URL --> jdbc:mysql://127.0.0.1:3306/nutzbook
  14. 21:22:25.145 DEBUG (MysqlJdbcExpert.java:212) checkDataSource - Mysql : character_set_client=utf8
  15. 21:22:25.146 DEBUG (MysqlJdbcExpert.java:212) checkDataSource - Mysql : character_set_connection=utf8
  16. 21:22:25.146 DEBUG (MysqlJdbcExpert.java:212) checkDataSource - Mysql : character_set_database=utf8
  17. 21:22:25.146 DEBUG (MysqlJdbcExpert.java:212) checkDataSource - Mysql : character_set_filesystem=binary
  18. 21:22:25.146 DEBUG (MysqlJdbcExpert.java:212) checkDataSource - Mysql : character_set_results=
  19. 21:22:25.146 DEBUG (MysqlJdbcExpert.java:212) checkDataSource - Mysql : character_set_server=utf8
  20. 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进行调整

本页面的文字允许在知识共享 署名-相同方式共享 3.0协议GNU自由文档许可证下修改和再使用。

原文: http://nutzam.com/core/basic/encoding.html