论坛首页 Java企业应用论坛

jsp中文问题

浏览 9499 次
锁定老帖子 主题:jsp中文问题
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2005-07-31  
看了不少java中文问题的文章,觉得自己有些关键的地方没有搞清楚,而且也少有人解释清楚,在这里将我的问题列举如下,大家讨论讨论。


1.

  第一步,程序员用编辑工具编写jsp文件,然后保存。此时如果不特别指定,一般都是以平台的默认编码保存的。比如在中文win2k上,这个jsp文件是以GBK编码的。

2 .

  web容器将jsp文件编译为servlet class文件。编译器需要读取硬盘上的jsp文件,那么它以什么字符集来解码呢?这个过程就像我们编辑一个文本文件,然后保存(是GBK编码),你再用编辑器打开时,编辑器会以GBK来解码一样。
  不过这里还是复杂一点,jsp编译器根据什么来确定解码字符集?是<%@page pageEncoding="GB2312"%>么?那么当2个页面指定的
  pageEncoding不同并且用include将其合在一起时,jsp编译器的策略是什么?

3.

  浏览器以get或post方法传递参数时,是以什么编码的?是否UTF-8?以get传递时还要经过urlencoding,除此之外和post方法还有何不同?看车东的文章http://www.chedong.com/tech/hello_unicode.html,get传递时,是先按GBK编码再urlencoding,我自己试验的结果也是如此。那么设定浏览器以UTF-8发送还有什么作用?另外,如果是这样,那么web容器怎么知道按什么来解码?因为客户端可是多种多样阿,传过来的参数什么编码的都有,web容器怎么处理?

4.

  web容器得到浏览器传递的参数,以什么字符集解码?若浏览器以UTF-8编码,这里只能是UTF-8,如果浏览器以平台字符集编码,那么这里web容器是怎样成功解码的呢?成功解码后,将参数写进request对象里时又是什么编码?默认ISO-8859-1?从request里取得的参数是以什么来解码?通过request.setCharacterEncoding("GB2312")指定?

5.

  servlet从request里取得信息,并进行一些操作后,往response的输出流里写入信息时又是什么编码?web容器从response输出流里读取时怎样解码?然后以什么字符集编码发送到客户端浏览器?默认ISO-8859-1?通过response.setContentType("text/html;charset=GB2312")指定?当2个页面通过include合在一起怎么办?


我尤其疑惑的是第3个问题。浏览器以get或post方法传递参数时,是以什么编码的?我想,如果这5个问题都搞清楚了,要是碰到jsp的中文问题应该都能自行解决了。
   发表时间:2005-08-01  
1.    jsp文件就是文本文件,保存得编码与你使用得编辑器相关,在jbuilder
里边如果你把系统编码设置为gbk,jsp默认会用gbk保存。
而在eclipse里边,则是按照jsp规范中指定得,如果页面没有指定编码规则,
则页面是iso8859-1,所以一个含有中文得文件,如果未指定编码,eclipse
保存后汉字全部变成问号。当然也可以手工指定每个文件的编码。

2.   web容器首先将jsp页面转换成servlet的java文件,对于每个jsp页面,
按照jsp的规范,其编码的确定有大概4个步骤,指定了pageEncoding的最
优先,还可以在配置文件中指定编码,很多种方式,我觉得指定
pageEncoding最方便。如果不指定,默认的是iso8859-1而不是系统的
默认编码。jsp规范是这样规定的,但是不同的web容器对于规范的实现
上稍有差别。但是一般来说,指定了pageEncoding之后,不会出现问题。
      web容器转换得到的java文件的编码——只有一个,UTF-8。

3,4   对于get/post的编码问题,这应该是http协议中的内容吧,
研究的不多。说说自己的经验。
对于post,发送和服务器端处理都是按照html的编码来进行的。
所以gbk的页面发送过去,用request.setCharacterEncoding("GBK")
即可得到正确的内容。但是注意,这个函数的调用必须在所有
request.getParameter的调用之前才有效。
对于get,浏览器发送的时候,对字符应该是按照html页面的编码进行url
的编码。而在服务器端,我没有研究jsp规范中是否有规定,只知道在tomcat
中,如果不进行配置,那么url编码的默认编码规则tomcat会认为是
iso8859-1,但是实际发送过来的是html页面中的编码的urlencoding,
所以会导致乱码。tomcat中可以设置useBodyEncodingForURI="true"来
解决这个问题。我记得有另一个属性可以指定url的编码,是URIEncoding吧。
召唤达人对get进行详细介绍。

5.   一个页面(包括其include 的文件),其contentType只能被指定一次
(用<%@page .. %>指定),但是有些服务器检查不严格,可能可以
指定多次。其输出的编码当然是这个指定的编码了。
对于包含,只需要在页首加上pageEncoding即可,参考2。

可能有疏漏或错误,大家多指点或补充。
注:提到jsp规范,都是指jsp2.0规范。可以从sun的网站下载。
0 请登录后投票
   发表时间:2005-08-01  
恩,谢谢楼上的解答。
我想,这里有2个问题:

1 浏览器根据本地编码将信息发送给服务器端,服务器端怎样解码?是读取http头信息accept language么?

2 成功解码后,构造request对象时,用什么编码?包括再从request里取信息。
我的想法是通过request.setCharacterEncoding("GB2312")指定,response同此理。

我想web容器总要经过解码-编码-构造request对象的处理过程,不知道对不对。
0 请登录后投票
   发表时间:2005-08-01  
html页面的meta信息中有页面的编码信息

request对象的解码取决于request.setCharacterEncoding,所以web容器并不需要
进行解码,解码可以在读取request中内容的时候再解

response的解码过程?就是一个字符流的写入过程,
写入的字符流是什么编码决定于contentType中的charset

所以,web容器对页面内容不需要做编码、解码的工作。
要说编码解码也就是对url请求进行解码而已
0 请登录后投票
   发表时间:2005-08-01  
引用
request对象的解码取决于request.setCharacterEncoding,所以web容器并不需要
进行解码,解码可以在读取request中内容的时候再解

web容器一开始从客户端取得的一定是经过编码的字节流对不对?然后不管怎样,它要把这些信息放进request对象。再然后,通过request. getParameter()取得信息。

coolnight的话让我突然意识到我想复杂了,java在内部都是unicode处理字符串,web容器将字节流解码后就是java的String了(unicode),以后web容器内部的处理都是unicode(包括request. getParameter())。

说得有点乱,我的意思是这样:

web容器取得字节流后,根本不进行解码,直到request. getParameter()时才根据request.setCharacterEncoding()的设置进行解码(转码,客户端编码到unicode),在这时才完成字节流到java String的转换。

而我原来想的是:web容器取得字节流后,马上进行解码,转成某种编码的字符流,再将此字符流转成字节流写进request对象中。这样request. getParameter()时当然就又要解码了。其实说到这里我自己都晕,确实是我自己没想明白,汗!
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics