嘿嘿,这些问题我的文章都准备讲到 :)
>1.要确定request.getParameter()得到用户输入的字符集是什么,这个好像跟应用服务器的处理有关吧
>2.要保持request得到的字符集编码和服务器端程序处理的编码一致
这就是我强调为什么要把HTML的contentType也设为UTF-8的原因所在了。
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
因为浏览器也支持UTF-8,所以当HTML设为UTF-8之后,当你在HTML的form里面填写了中文之后,进行提交,浏览器会把中文转成UTF-8提交给服务器的。
而服务器拿到UTF-8编码的中文字符串以后,是不会做任何转换的(这是因为UTF-8编码是经过特别的设计的,具有自识别能力,在二进制上不可能和任何非ASCII码字符集的编码重叠),直接进行处理。
因而只要你把所有的JSP/HTML都设为UTF-8,就可以做到和应用服务器环境,甚至操作系统环境无关,request得到的编码总是UTF-8编码。
总之秘诀就是两点:
1、HTML/JSP都是UTF-8
2、浏览器支持UTF-8编码
在纯web应用中,字符串无非就是在浏览器和App Server之间交换,Java内部统一用UTF-8处理字符串,而你再把浏览器环境设为纯UTF-8环境,就可以保证字符串在浏览器和App Server之间不管怎么处理,自始至终都是以UTF-8的形态存在的,那么当然不会出现中文乱码问题,国际化问题也可迎刃而解。而在UTF-8和GBK字符集编码之间进行转换的工作其实是由浏览器来做的,而不是App Server来做,所以当然可以做到App Server无关性了。
>3.要保持存入数据库的编码和取出时的编码一致
Java内部是使用UTF-8编码的,在Java内存中和数据库中进行转换的规则取决于JDBC驱动的设定。一般来说有两种情形
1)以Oracle为代表的JDBC驱动类
这类JDBC驱动的转换规则是:数据库默认字符集是什么,就按照什么转换。比如说如果Oracle数据库默认字符集是GBK,那么写数据库的时候,JDBC驱动会把字符串由UTF-8转换为GBK,读数据库亦然。
这类驱动可以说省心省力,只要DBA安装数据库的时候把字符集设对,就不存在乱码问题。但是最怕DBA把字符集设为Latin-1(Latin-1就是ISO8859_1),由于数据库支持双字节,就算是Latin-1的字符集,数据库也能够正常处理中文,但是此时JDBC可不管这一套,肯定是把中文字符串的UTF-8编码往Latin-1上转,这样肯定完蛋,所以请扁DBA吧。
2)以MySQL的mmjdbc为代表的JDBC驱动类
这类驱动的转换规则是:不管数据库默认字符集是什么,总是默认的往Latin-1上转,所以中文肯定乱码。所幸的是这类驱动一定会提供一个连接参数,让你自己设定转换规则:
characterEncoding=GBK
这就声明了把UTF-8字符串往GBK上转换。所以就解决了中文乱码问题。
如果数据库就支持UTF-8编码,那么把数据库默认编码设为UTF-8,可以做到读写数据库也支持多国语言编码,但是有一个麻烦的地方是,数据库的客户端程序未必如浏览器那样能够自动进行UTF-8和操作系统字符集编码的转换,所以当你用数据库自带的客户端连接数据库的时候,可能会看到数据库里面全是乱码。