关于Java平台国际化数据编码常见问题分析
王旭科
MSN:sunosewang@msn.com
一. 前言
经常在看到有关讨论Java相关技术的汉字的显示,数据存储汉字乱码的解决方法。本人从事Java平台相关开发也有近5年的时间,深感这种有关数据编码(Encoding)的问题,不是一个简单的描述就可以指出问题的原因所在。目前零星的解决方案没有提供一个全面的解释。不同的浏览器,Web Server,Application Server,Database,支持的JDK版本不同,及设计的架构不周全,其组合是一个庞大的基数,下面就从B/S 3层架构的角度,说明国际化的数据编码常见问题的分析及解决方法。希望能分享自己的经验。
二. 常见Java应用架构
图 1
以上是基本的Java常见架构,实际中可能Web server和应用服务器(Application Server)合二为一,不过为了清晰起见,还是分开显示.
2.1 请求/响应(Request/Response) 工作模式
基于B/S架构的应用的模型,就是终端用户通过浏览器向web Server发送请求,Web解释并响应请求。其事件流模型可以参考标准HTTP协议获得细节。常见的数据转换及传送发生以下三个环节.所有的转换都是双向的.负责每个环节数据编码(Encoding)的角色不同,需要对每个环节的角色进行正确的参数设定互相配合才能得到期望的结果。
浏览器 ?----------àWeb Server. Browser Render引擎/Web Server 引擎
WebServer ?-------à 应用服务器 .JSP/Server 引擎及可能存在的其他连接WebServer
和Application Server的Plugin.
应用服务器 ?-------------à 数据库 .每个数据库厂家的JDBC驱动器.
这里最重要和最易变的是Browser ?>WebServer ?-àJSP/Servet 之间的数据流和事件流发生的数据编码,JDBC如果只是利用纯粹的thin的模式来访问数据库,逻辑比较简单,如果通过不同数据库厂家为了提高性能提供的利用本地client的方式来访问数据库,其配置复杂性随不同厂家而不同,这里略过。以下对该事件流做详细描述,以阐述后面发生的”内幕”.
2.2 浏览器 HTML Render引擎如何显示和提交数据.核心的URL-Encoding.
浏览器渲染html页面里的内容如何编码,决策顺序如下。
首先浏览器根据Web Server发送的Content-Type Header,里的Charset信息来决定自己如何渲染html的显示。如果没有Content-Type,就根据Html页面里的中的Content-Type来决定渲染的字符编码.一般如下:
一般出现乱码的情况,有可能是content-type同实际数据不符,所以使用浏览器的”改变
编码”的功能换一个字符集合,就能看到正确的数据.如果以上有关字符编码的信息都无
法得到,浏览器采用默认的ISO-8859-1来渲染HTML页面
其次,浏览器向WebServer通过 Form提交数据的时候,其编码数据的行为决策顺序如
下
1.