6.1 HTTP协议及浏览器编码行为
HTTP协议和浏览器是Web国际化的基础,在进入Java服务器端之前,必须先对它们的编码行为有所了解。
6.1.1 HTTP协议
HTTP协议是B/S体系结构应用程序的基础,只有了解了HTTP协议,才能理解如何在B/S体系结构下实现应用程序的国际化。
1.HTTP请求
当用户在浏览器的地址栏中输入一个URL并按回车键之后,浏览器会向HTTP服务器发送HTTP请求。HTTP请求主要分为“Get”和“Post”两种方法。
2.采取“Get”方法的HTTP请求
“Get”请求的典型用途是从HTTP服务器获取指定的资源,这样的请求不包含请求体。在浏览器中输入一个URL并按回车键后,浏览器就会生成这种 类型的请求。HTTP服务器根据该请
求所包含URL中的参数来动态产生响应内容,即“Get”请求的参数是URL的一部分。例如:
www.baidu/s?wd=Chinese
上述URL是一个使用百度搜索关键字“Chinese”的URL,参数“wd”包含在URL中,一起发送到HTTP服务器,参数的值是“Chinese”。当参数名和参数值都是ASCII字符时不会出现问题,但当参数名或参数值中包含非ASCII字符时就有可能出现问题。
由于URL通过网络传递,因此,为了保证信息的兼容性和通用性,当URL包含非 ASCII字符时,必须对其进行转义。如果将上例中的参数值改为“中文”,则URL变为:
www.baidu/s?wd=中文
当在浏览器(我们使用的是Firefox2.0)的地址栏中输入上述URL并按回车键后,可以看到浏览器会自动对URL进行转义,得到的是:
www.baidu/s?wd=%D6%D0%CE%C4
可以看到“中文”已经被浏览器自动转义成为了%D6%D0%CE%C4,它们是汉字“中文”的GB
K编码对应的转义形式。另外,不同的浏览器对URL进行转义的行为是不同的,具体内容请参阅6.1.2节的介绍。
当HTTP服务器收到这样的请求时,必须先将转义的字符解释为有效的字符,再对URL进行处理。但是,HTTP协议中并没有指定使用何种编码和字符 集来解释URL中的非ASCII字符(细节可参阅RFC2396,2.1节),因此,是否能成功解析就完全取决于URL中非ASCII内容的编码是否与 HTTP服务器的解析编码一致。例如,如果我们希望在Google中也搜索“中文”,构造如下URL:
le/search?q=%D6%D0%CE%C4
在浏览器地址栏中输入这个URL并按回车键后,会发现搜索结果页面查询的关键字并不是“中文”而是一个不能识别的乱码。这是因为Google的HTTP服务器使用UTF8编码来解释URL中的非ASCII字符。如果使用下面以UTF8编码的URL就能得到正确的结果:
le/search?q=%E4%B8%AD%E6%96%87
请注意:Google在不同区域的服务器可能会使用不用的编码方式来解析URL。例如www.g
oogle可以正确解析:le/search?q=%D6%D0%CE%C4;而le只能正确解析:http: //le/search?q=%E4%B8%AD%E6%96%87。
而且,由于Google可以根据用户浏览器的区域设置自动将用户重定向到某个特定区域的服务器上,因此在Firefox中,如果浏览器的首选区域是 zh-cn,那么访问如下url:le/search?q=%D6%D0%CE%C4会被自动重定向到http: //le /search?q=%D6%D0%CE%C4,因此,显示的结果是正确的。
3.采取“Post”方法的HTTP请求
“Post”请求通常用来向HTTP服务器提交量比较大的数据(比如请求中包含许多参数或者文件上传操作等),它与“Get”方法的主要区别在于请求的参数包含在消息体而非 URL中,服务器同样需要获得正确的编码信息才能够正确解析在消息体中的请求参数。在 “Post”方法的HTTP请求中,通常包含一个“Content-Type”消息头指明该消息体的媒体类型和编码,如“Text/XML; charset=gb2312”,指明该请求的消息体中包含的是纯文本的XML类型的数据,字符编码采用“gb2312”。 (在request方式中就不行吗?)
使用一些Firefox插件可以辅助开发人员分析请求的消息头和消息体,较常用的有Firebug等。
4.HTTP响应
HTTP响应是HTTP服务器在接收请求之后向客户端返回的信息。一个HTTP响应通常由状态行、消息头和消息体组成。HTTP响应消息的第一行是 状态行,表示服务器对请求的应答。常见的应答有:“200:OK”、“404:Not Found””、“500:Internal Server Error”等。
与HTTP请求类似,HTTP响应消息也包含一个“Content-Type”消息头,它指定了消息体中内容的类型和编码,例如 “text/html; charset=UTF-8”。只有正确指定了“Content-Type”消息头,浏览器才能正确解析收到响应消息体中的数据并呈现页面。
6.1.2 浏览器行为分析
浏览器是发送HTTP请求和接收HTTP响应的客户端,HTTP协议保证了大多数情况下浏览器行为的一致性,但不同浏览器之间仍有许多差异。这些差异经常导致B/S体系结构应用程序的开发变得困难。本节着重解释不同浏览器在涉及国际化方面的不同行为。
html中提交表单用什么属性
1.发送请求
使用浏览器发送HTTP请求有多种方式:
在浏览器地址栏中直接输入URL;
在页面中通过点击“提交”按钮提交表单;
用户在页面中点击超链接产生的请求;
使用JavaScript脚本的XMLHTTPRequest对象发送请求。
(1)在浏览器地址栏中直接输入URL
当URL中包含非ASCII码字符时,Firefox会自动将这些字符进行转义,转义使用的编码由浏览器的语言版本决定。例 如,“www.baidu/s?wd=中文”将会转义为www.baidu/s?wd=%D6%D0%CE %C4。
Firefox也提供了使用UTF-8进行URL编码的选项。在地址栏中输入“about:config”,并按回
车键打开配置页面,在过滤器中输 入“de-utf8”以定位到该选项,如图6-1所示。将该选项的值修改为true,以使 Firefox始终用UTF-8对URL进行转义。这样,上述URL将转义为www.baidu/s?wd=%E4%B8%AD %E6%96%87。
默认情况下,中文Windows平台上的IE浏览器将URL分为两个部分,“?”之前的部分URL使用UTF8进行转义,而“?”之后的参数部分, 则不进行转义而直接使用GBK编码发送。例如URL“localhost/中文.jsp?test=中文”,前一个“中文”将按照UTF8 编码的转义形式“%E4%B8%AD%E6%96%87”发送,而参数部分的“中文”则直接以GBK编码发送,因此,最终发送的URL如图6-2所示。
在IE的“Internet选项”的“高级”选项卡页中有一个选项“总是以UTF-8发送URL”,在缺省情况下该选项是选中的。如果去掉这个选项,IE将会以系统当前的代码页来对URL进行编码。在中文Windows中整个URL都将以GBK编码发送,如图6-3所示。
(2)在页面中通过单击“提交”按钮来提交表单
在表单中属性“method”用来指定提交表单时所使用的HTTP请求方法,可以选择Post或者G
et。用户不指定时,默认采用Get方法。而表单所提交内容采用的编码则由页面当前的编码决定。例如,在一个JSP中包含以下表单代码:
===formencoding.jsp====
<%@ page language="java" contentType="text/html; charset=GBK"
    pageEncoding="GBK"%>
<form action="formencoding.jsp" >
<input type="text" name="中文" ></input>
<input type="submit"/>
</form>
在IE或Firefox浏览器中打开该页面,在“中文”输入框中填入“中文”并单击“提交”按钮,会产生一个Get请求,所使用的URL为:
localhost:8080/jsbook/formencoding.jsp?%D6%D0%CE%C4=%D6%D0%CE%C4即使用GBK编码对URL进行转义。
如果将该页面的contentType重置为contentType="text/html; charset=UTF-8",则该表单所产生的URL为:
localhost:8080/jsbook/formencoding.jsp? %E4%B8%AD%E6%96%87= %E4%B8%AD%E6%96%87%即使用UTF-8编码对URL进行转义。
如果表单使用Post方法,则提交的参数将放在请求的消息体中,而使用的编码方式仍将由该页面的编码方式决定。
(3)在页面中单击超链接产生的请求
用户单击页面中的超链接时,浏览器将会产生一条“Get”请求。这个请求的URL使用的编码方式由当前页面使用的编码及使用的浏览器共同决定。我们仍然使用前文的例子“localhost/中文.jsp?test=中文”来说明。
在IE中,页面编码为UTF8时,这一请求中“?”前的部分将以UTF8编码转义,而“?”后的参数部分将直接使用UTF8编码发送;当页面编码为GBK时,请求中“?”前的部分仍以UTF8编码转义,而“?”后的参数部分将直接使用GBK编码发送。
在Firefox中,页面编码为UTF8时,整个URL将以UTF8编码转义。如果页面编码为GBK,则请求以GBK编码转义。
如果在IE中禁用了“总是以UTF-8发送URL”选项,那么当页面编码为UTF8时,这一请求中“?”前的部分将以UTF8编码转义,而“?”后的参数部分将直接使用UTF8编码发送;当页面编码为GBK时,整个请求都将直接使用GBK编码发送。
(4)使用XMLHTTPRequest对象发送请求
最后,我们来看一下使用JavaScript脚本来发送请求的情形。XMLHTTPRequest对象(下面简称XHR)是构成Ajax应用程序的基础,它允许JavaScript脚本直接向服务器发送HTTP请求,在页面不刷新的前提下与服务器通信,提交和获取数据。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。