需要注意编码格式的地方有很多,好多默认的编码格式也都是不统一的,如果设置不当,就容易出现中文乱码现象。
- 关于编辑器的编码:
- 用记事本和Eclipse编辑保存的文件,默认都是操作系统的编码,即GBK。
Eclipse比较牛,它可以根据你在具体文件中设置的encoding来自动更改文件保存的编码,例如,可以在文件中设置JSP、XML、HTML的编码格式,那么Eclipse在保存时就会使用相应的编码格式。 - 如果没有在文件中设置encoding,那就保存成默认的GBK,例如,你在Eclipse中编写的“.txt”、“.java”默认都是GBK编码的。
- 关于Java的编码:
- Java内部字符串String用得都是Unicode编码,所以Java内部的字符串可以说是没有编码的。
- 但是Java平台是有编码的,编码是操作系统的默认编码,即GBK。也就是说,Java在编译“.java”时,会默认认为“.java”是GBK编码的。当然,可以手动指定编译时使用的编码,这里就不提了。
- Java编译出的“.class”都是UTF-8编码的。Java能正确地完成“.java”到“.class”的编码格式转换,但前提是一定要让Java知道“.java”的正确编码格式。例如,如果你的“.java”不是默认的GBK编码,而是UTF-8编码的,而Java默认却认为是GBK的,那么编译完运行时,中文就显示乱码了,因为Java没能知道“.java”的正确编码格式。
- 关于Java IO的编码:
- 方法InputStreamReader可以指定用什么编码格式来将读取到的字节流转换成字符,如果方法中指定的编码格式与字节流的实际编码格式不一致,则会出现乱码。
写文件时也是同样的道理。例如,对于方法OutputStreamWriter来说,如果把写文件时的编码格式设置成UTF-8,将数据写到“.txt”中,那么当我们用记事本查看这个文件时,由于记事本默认用的是操作系统的GBK编码格式,那么打开后看到的就是乱码了。 - 而方法BufferedReader、BufferedWriter采用的是Java的默认编码格式,即操作系统的编码,即GBK,不能手动设置方法编码格式。
- 关于JSP的编码:
- pageEncoding是JSP文件本身的编码,JSP文件不像“.java”,“.java”在被编译器读入的时候默认采用的是操作系统的编码格式。
contentType的charset是指服务器发送给客户端时的内容的编码。
pageEncoding和contentType的charset的预设都是ISO8859-1(Latin-1),所以要自己手动设置。 - JSP要经过两次的“编码”,第一阶段会用pageEncoding,第二阶段会用UTF-8到Unicode,第三阶段是由Tomcat输出来的网页, 会用contentType。
第一阶段是JSP编译成“.java”,它会根据pageEncoding的设置读取JSP,结果是由pageEncoding指定的编码方案翻译成UTF-8编码的“.java”,如果pageEncoding设定错了,出来的就是乱码。
第二阶段是“.java”到“.class”的编译,这个阶段是UTF-8到Unicode。
第三阶段是Tomcat载入和执行阶段二来的Java二进制码,输出的结果,也就是在客户端见到的。这个阶段contentType的charset起作用。 - 在Servlet中的doPost或doGet方法的开始处可以使用request.setCharacterEncoding("utf-8");和response.setCharacterEncoding("utf-8");来设置编码格式。
- 关于Tomcat的编码:
- Tomcat的默认编码是ISO-8859-1(Latin-1),一个汉字占用两个字节。所以在页面数据传递过程中,必须手动设定容器编码格式,否则会出现乱码。
- 在Tomcat的“server.xml”中的Connector标签里面可以设置2个参数,用来更改编码格式:
(1)useBodyEncodingForURI="true"这个参数告诉Tomcat用页面的编码格式(即属性contentType中的charset值)去处理POST,推荐使用。
(2)URIEncoding="utf-8"这个参数是强制指定编码格式为UTF-8,有点狠。
- 关于MySQL的编码:
- MySQL的默认编码是ISO-8859-1(Latin-1),可以修改。
- 在“my.ini”中有两个地方要设置:
(1)default-character-set这个参数告诉MySQL,客户端连接到数据库时,传过来的数据所使用的编码格式,如果这里设置的编码格式和页面内容的实际编码格式不一致,那么MySQL会错误地对传过来的数据进行解码,到时候把这些数据存储到数据库中时就是乱码了。
(2)character-set-server这个参数是数据库中存储的数据所使用的编码格式。 - 最好在连接数据库用的URL中也指定连接的编码格式,例如useUnicode=true;characterEncoding=utf-8。