`

解析访问JSP一系列的编码解码过程

阅读更多
乱码是个让人头痛的问题...
页面的乱码,servlet中的乱码,数据库的乱码....
一个烦字了得..

解决的方法也很早就出来...不多讲...
先看看两个网址:
http://www.google.cn/search?client=aff-cs-worldbrowser&forid=1&ie=utf-8&oe=UTF-8&hl=zh-CN&q=开源

http://www.iteye.com/search?type=all&query=分页

点击看看什么效果..选中URL,再回车看看...

--------------------------------------------------------

说说从URL到servlet再到页面的一系列编码解码过程..
首先知道在JAVA中的字符都是使用unicode
其次,我们假定在页面中使用了utf-8编码,当然你还可以使用gb2312之类的...但强烈建议你使用utf-8

1.输入URL...
    此时,servlet引擎就做些事..
    把URL进行编码,按照ISO8859-1字符集编码进行转换成UNICODE,再封装到ServletRequest对象中.
    当我们使用表单的时候,post,get方式,会以页面的字符编码对表单中的内容进行,编码.这个过程有点像URLEncoder.encode()方法的效果...

2.得到URL中的参数..
    这是我们常做的,一个方法而已嘛..request.getParameter("paramName")
   这个方法的背后还有一些解码工作..
   乱码的原因有时就在此..
   getParamter方法,对URL进行解码,在servlet规范中没有明确规定解码所采用的字符集编码,它由各个servlet引擎厂商自行决定...tomcat中默认采用ISO8859-1字符集进行URL解码.
   对于post方式:可以使用request.setCharacterEncoding(),方法指定别的解码方式.
   对于get方式:
   可以使用原始的方法new String(param.getBytes("iso8859-1"),"utf-8")
这条语句在这儿的作用:
   把getParameter方法解码成的错误unicode还原成正确的编码.
怎么讲呢?这儿解释有点麻烦..
在页面中提交表单的时候,表单内容使用页面字符码utf-8编码,而getParameter默认的方法是以iso8859-1解码的,所以如果你不处理下,就会是乱码了...
ISO8859-1与unicode之间的转换是无损的..
  我们使用getBytes("iso8859-1")还原成正确的字符数组,再以utf-8编码,就得到正确的结果了..
   这个过程是这样的:
    (以utf-8编码)           getParameter以(ios8859-1)解码
URL--------------->字符数组------------------------------>UNICODE(错误)
   
   使用getBytes("iso8859-1")还原         new String(bytes,"utf-8")
UNICODE------------------------>字符数组--------------->UNICODE(正确)-            

  也可以修改server.xml
 <Connector port="8080" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8443" [color=red]URIEncoding="utf-8[/color]"/>


让url解码时使用utf-8.
   
   记得上面让做实验吗...选中URL,回车.此时,URL中的中文字符是以本地符编码的.就是GB2312编码..
   像javaeye的.URL中的是GB2312,而在后台处理的时候以使用的utf-8,所以就出现了乱码..google的那个, 参数中有个ie,那可能就是浏览器的编码,如果改成gb2312就不会出现乱码...在这个方面.google比baidu做得优秀..页面的编码也会根据这个参数来确定,..而baidu只是对gb2312处理了..所以从这点看,baidu还是没有走向国际化..你可以再做实验验证下..
   直接在输入URL,过程也一样
   先对URL编码,以ISO8859-1编码,getParameter解码..GB2312---->UNICODE
 

3,页面得到字符.
   在servlet中,都是unicode的编码,会以request.setCharacter()编码成字符数组.
在页面中显示时,再以contentType属性解码一下..所有这两处得一致.!

----------------------
以上就是其中的一些过程,还有一些细节...
比如在servlet中没有使用setCharacterEncoding方法,也没有使用相应的filter处理,
那么如果有URL的参数的时候,显示得使用URLEncoder.encode()编码下..在页面上的URL中才会正确显示..

   对于编码和解码,都是对称的...底层都是使用字节数组来传递,我们只要知道了这个字节数组是怎么得到的就知道怎么去处理,也知道乱码原因在哪一步...
    比如输入URL,URL中的是GB2312,先是URL编码,GB2312以ISO8859-1---->字节数组..getParameter又以ISO8859-1对字节数组解码,此时,你写上new String(p.getBytes("iso8859-1"),"utf-8")就是乱码...
写p.getBytes("iso8859-1"),"gb2312"就是正确的..
   在搜索分页的时候,下一页带的中文参数,一般都会在页面上显示得对它进行URLEncoder.encode,如果没有,就得在servlet中进行重新解码..也就是getBytes一下..
        1.在页面中不显示encode,那么在servlet中使用getBytes,重新编码.
  这是因为:URL中的UTF-8字符------(ISO8859-1)-------->字符数组-------getParameter以iso8859-1解码--------->unicode,这里的UNICODE是不正确的,它是UTF-8编码的.
   2.在页面中显示encode下,这个过程也可以在servlet中进行,encode(key,"utf-8"),在servlet中不要进行request.setCharacter(),也就是在servlet中只有iso8859-1与UNICODE间的转换...到页面的时候才涉及到本地符...

-------------------------------------------
关键点:对称的转换...底层字节数组的编码类型..
最好在页面中显示得主动URLEncoder.encode一下,更保险.
中文在ISO8859-1中没有对应的编码..
比如URLEncoder.encode("中","ISO8859-1")就不能得到正确的错误的结果..
因为这个转换是有损的,不可逆的..

-------------------------------------------
我在网站中的一些问题:
   我的网站是使用的utf-8.它是所有字符编码的超集,兼容所有字符..建议使用..
但空间服务商把tomcat/conf/server.xml中配置了URIEncode="GB2312".
  ,建议他改成UTF-8,但他又不改..很是无奈.
我的解决办法,就是在页面的主动编码使用
URLEncoder.encode(keyworks,"gb2312");

这样在URL中的都是通过GB2312编码的字符.这个语句也可以写到servlet中.
后台request.getParameter("query");就不需要处理.. 

3
0
分享到:
评论

相关推荐

    淘特JSP留言板 v0.1_tot-jsp-gb(毕设 + 课设).zip

    10. **Ubb编码**:`Ubb.class`可能用于实现UBB(Ultra-Board Bulletin)编码解码,UBB是一种轻量级的文本标记语言,常用于论坛和留言板,用于格式化文本,如加粗、斜体、插入图片等。 这个留言板系统虽然简单,但它...

    JSP JSTL EL表达式中FN函数使用帮助

    FN函数是JSTL提供的一个功能强大的工具,包含在`javax.servlet.jsp.jstl.fn`包下,提供了一系列实用的方法,用于处理字符串、数组、集合等数据类型。 FN函数库主要由以下几部分组成: 1. **字符串处理**:例如`fn:...

    Jmail结合JSP实现邮件的收发

    JavaMail API的核心是`javax.mail`包,其中包括了一系列接口和类,如`Session`、`Store`、`Folder`、`Message`等。 - **JSP (JavaServer Pages)**:JSP是一种基于Java技术的Web开发技术,它允许开发者将动态脚本...

    支付宝jsp接口

    1. **API概述**:支付宝提供了一系列的API,包括即时到账、担保交易、退款、查询等服务。这些接口通过HTTP请求进行调用,通常采用POST方式,返回结果以XML或JSON格式。 2. **SDK使用**:为了方便开发者,支付宝提供...

    04C、JSP程序设计(下)1

    - JSP程序的编码问题通常涉及到页面编码设置、响应内容编码以及请求参数的编码解码。 6. **参考资料**: - 课程可能提供了更多的学习资源,帮助开发者深入理解和应用这些JSP和JSTL的概念。 综上所述,本节JSP...

    支持中文下载的JSPSMARTUPLOAD

    这个库的核心在于能够正确地编码和解码中文字符,使得在上传、存储以及下载过程中,中文文件名可以被完整且准确地保留下来。 **核心类解析:** 1. **SmartUpload.class**:这是JSPSMARTUPLOAD的主要类,提供了整个...

    jsp中乱码问题的解决方案

    本文将深入探讨JSP环境中出现中文乱码的原因,并提供一系列实用的解决方案。 #### 一、理解中文乱码现象 在JSP页面中,中文乱码通常表现为一些无法识别的字符或符号。这种现象的发生主要是因为字符编码设置不一致...

    编码问题介绍

    UCS包含了一系列的code point,每个code point对应一个唯一的字符。 Java的Class文件以UTF-8编码存储,这意味着所有源代码中的字符串在编译后都会转化为UTF-8格式。然而,Java虚拟机(JVM)在运行时使用UTF-16编码...

    金盾信安比赛记录.pdf

    在这里,解密过程可能涉及到了多次编码解码转换。 6. **音乐符号与编码解码** 题目中提到的低音吉他谱提示了Base64编码。将音乐符号`B6/4`视为Base64并解码,但无法直接得出结果,需要尝试不同的编码方法,最终...

    jsp乱码问题

    本文将深入探讨JSP乱码问题的成因,并提供一系列实用的解决策略。 #### JSP乱码的常见原因 1. **编码不一致**:JSP页面、客户端提交数据、服务器端读取数据以及数据库之间的编码设置如果不统一,会导致乱码。例如...

    jsp开发ueditor smartUpload上传文件测试样例

    ueditor是由百度开发的一款开源的Web在线富文本编辑器,提供了一系列丰富的编辑功能,如文字格式化、图片上传、视频插入等。它支持多种后端语言,包括Java,使得开发者可以轻松地在JSP项目中集成。 2. **...

    JSP源码——Noka tag 软件标签 v3.0_noka3.9.zip

    《深入解析JSP Noka Tag软件标签库v3.0_noka3.9》 在Web开发领域,JavaServer Pages(JSP)是一种广泛使用的服务器端脚本语言,它允许开发者将HTML、XML或者其他标记语言与Java代码混合,以创建动态网页。Noka Tag...

    JSP方法(总结)

    2. **PageContext对象**还提供了一系列的方法来管理JSP页面的生命周期,包括页面初始化、页面处理过程中的数据管理、异常处理以及页面销毁等阶段。这对于构建高效稳定的Web应用程序非常重要。 总之,`Request`对象...

    最新版本的JavaMail和 JavaBeans Activation Framework 1.1.0 解决jsp发送邮件问题

    在最新的1.1.0版本中,这两个库提供了一系列改进和修复,旨在优化开发者在使用JSP(JavaServer Pages)进行邮件发送时的体验。本文将深入探讨JavaMail和JAF的核心功能,以及如何利用它们解决JSP中的邮件发送问题。 ...

    java字符编码错误整理大全

    在Java开发过程中,字符编码问题是非常常见且容易引发一系列乱码问题的重要因素。本篇将详细梳理Java中的字符编码相关知识点,帮助开发者解决实际工作中遇到的各种乱码问题。 #### 二、基础知识 1. **编码与解码**...

    电子邮件解析算法的研究与实现

    - **正文**:是邮件的具体内容,由一系列ASCII字符组成。 ##### MIME格式的邮件报文 MIME(多用途Internet邮件扩充)是对RFC822的一种扩展,通过RFC2045-RFC2049五个文档定义,支持非ASCII字符和多种非文本数据...

    110个知名Java项目集锦

    - **简介**:Chain 是一个实现了 GoF 设计模式中的责任链模式的框架,它可以用来构建一系列处理者对象。 - **特点**: - 支持按顺序或跳转的方式传递请求。 - 提供了一种灵活的方式来组织和管理处理逻辑。 - 可以...

    java Web开发乱码解决方案

    本文将详细介绍Java Web开发中出现乱码的原因,并提供一系列解决方案。 #### JSP页面配置及乱码成因 在JSP页面中,`;charset=GB2312" %&gt;` 这样的声明指定了页面的内容类型以及字符集。这里的 `contentType` 属性...

    论文研究-基于J2ME技术的手机预订机票系统的设计与实现.pdf

    J2ME由Java语言的核心库和一系列的Java API组成,专门针对小型设备的有限硬件资源和功能进行了优化。J2ME平台包含一个虚拟机、一组API以及一套配置和简档规范,配置定义了设备的最小资源限制,简档则定义了特定类型...

    JavaAxisWebService需要的jar包

    5. activation.jar和javamail.jar:这两个包是JavaMail API的一部分,用于处理电子邮件相关的操作,包括MIME编码和解码,对于处理Web服务中的附件很有用。 6. commons-discovery.jar和commons-logging.jar:Apache ...

Global site tag (gtag.js) - Google Analytics