Java Web 开发中的编码问题
- 2010-04-11
- jferic
(问题思考,没有完全明白)
每次和java web打交道的时候都会为编码问题头疼。不能完全责难java,在web开发这种环境中,“中文编码“的问题是普遍存在的。
分析原因:
1 “中文”支持太弱。很多软件(尤其是开源软件)对中文等的支持很有限。
2 开发中涉及的软件很多,软件之间的交互默认值情况各异。
现在理理思路,如何沉着的面对和妥善的处理“中文编码”问题。
首先是选定特定的应用编码,处理中文一般可以选择UTF-8、GBK、GB2312
其次需要考虑的java web开发环境包括:开发工具,服务器,客户端,数据库,以及数据交互的方式
开发工具,主要是编辑器
服务器(web容器),编译Jsp页面,servlet请求和相应
数据库,自身编码、客户端显示编码、链接编码、结果编码
然后考虑java web开发中的对象包括:Jsp页面、java(servlet)源码、数据库编码、请求响应编码、数据库链接编码。
处理Jsp页面编码:
Jsp页面向客户端输出编码:<%@ page contentType=”text/html; charset=gb2312″ %>
Jsp页面获取正确的传入:<% request.setCharaterEncoding(”gb2312″); %>
编辑器正确读取Jsp页面:<%@ page pageEncoding=”gb2312″ %>
处理数据库编码:
直接修改数据库的编码:设置default-character-set=gb2312,参考http://www.ej38.com/showinfo/mysql-158036.html
或者,注意设置set names utf8,参考http://hi.baidu.com/kkwtre/blog/item/c5ef108254b732a30cf4d2ba.html
服务器请求和响应编码:参考http://blog.csdn.net/yzhz/archive/2007/07/03/1676796.aspx
请求分post和get两种方式:
post方法,表单数据作为请求的消息体发送,此时浏览器会根据网页的ContentType(”text/html; charset=gb2312″)中指定的编码进行对表单中的数据进行编码,然后发给服务器。
在服务器端的程序中我们可以通过Request.setCharacterEncoding() 设置编码,然后通过request.getParameter获得正确的数据;
get方法,数据作为URL的一部分,中文会预先使用URL规约转换(添加%,并编码中文),中文编码会根据浏览器的具体设置选定。Request.setCharacterEncoding() 设置对get方式传过来的参数无效,故request.getParameter获得的数据很可能是乱码。故使用URL encode指定编码字符集。(这里URL中将中文如何编码的呢?搞不懂。难道是在URL的%转换中被指定为一种编码,然后网络传输中(java)使用ISO-8859-1编码?到服务器端后,什么时候根据URIEncoding的设置做何处理呢?)
Servlet服务器实现的Servlet遇到URL和POST提交的数据中含有%的字符串,它会按照指定的字符集解码。request.getParameter(”xxx”)方法返回的结果是经过解码的。这里所说的”指定的字符集”是在应用服务器的配置文件中配置。例如 tomcat服务器,配置文件是server.xml :
<Connector port=”8080″ protocol=”HTTP/1.1″ maxThreads=”150″ connectionTimeout=”20000″ redirectPort=”8443″ URIEncoding=”gb2312“/> URIEncoding告诉服务器servlet解码URL时采用的编码。
<Connector port=”8080″ … useBodyEncodingForURI=”true” /> useBodyEncodingForURI告诉服务器解码URL时候需要采用request body指定的编码。
响应返回浏览器,浏览器根据http头中的ContentType(”text/html; charset=gb2312″),指定的字符集来解码服务器发送过来的字节流。我们可以调用 HttpServletResponse.setContentType()设置http头的ContentType。