浏览 9489 次
锁定老帖子 主题:jsp中文问题
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2005-07-31
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的中文问题应该都能自行解决了。 ![]() 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间: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的网站下载。 |
|
返回顶楼 | |
发表时间:2005-08-01
恩,谢谢楼上的解答。
我想,这里有2个问题: 1 浏览器根据本地编码将信息发送给服务器端,服务器端怎样解码?是读取http头信息accept language么? 2 成功解码后,构造request对象时,用什么编码?包括再从request里取信息。 我的想法是通过request.setCharacterEncoding("GB2312")指定,response同此理。 我想web容器总要经过解码-编码-构造request对象的处理过程,不知道对不对。 |
|
返回顶楼 | |
发表时间:2005-08-01
html页面的meta信息中有页面的编码信息
request对象的解码取决于request.setCharacterEncoding,所以web容器并不需要 进行解码,解码可以在读取request中内容的时候再解 response的解码过程?就是一个字符流的写入过程, 写入的字符流是什么编码决定于contentType中的charset 所以,web容器对页面内容不需要做编码、解码的工作。 要说编码解码也就是对url请求进行解码而已 |
|
返回顶楼 | |
发表时间: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()时当然就又要解码了。其实说到这里我自己都晕,确实是我自己没想明白,汗! ![]() |
|
返回顶楼 | |