如何解决JavaWeb乱码问题

如题所述

request-line中的URL部分必须以application/x-www-form-urlencoded方式编码。编码时使用的字符集是当前网页在浏览器上显示时所使用的字符集。

JDK中专门有两个类处理application/x-www-form-urlencoded类型的数据,它们是URLEncoder及URLDecoder。当网页上的数据需要手动进行URLEncoding处理时,可使用URLEncoder类完成编码工作。需要手动进行URLEncoding处理的位置包括:

    链接(<a></a>)中的href标签属性;

    以POST方式提交的表单(<form></form>)中的action标签属性。

    例如,网页上不应该产生这样的链接:

    [xhtml] view plain copy

    <!-- ä¸æ­£ç¡®çš„写法 -->  

    <a href="/hello/checkUser.html?opt=中文>使用者身份验证"</a>  

    正确的写法是:

    [xhtml] view plain copy

    <!-- ä½¿ç”¨UTF-8字符集进行URLEncoding的结果 -->  

    <a href="/hello/checkUser.html?opt=%E4%B8%AD%E6%96%87">使用者身份验证</a>  

    为此,方案之一可以在JSP网页上使用脚本化语言进行URLEncoding处理。如:

    [xhtml] view plain copy

    <%@page import="java.net.URLEncoder"%>  

    <a href="/hello/checkUser.html?opt=<%=URLEncoder.encode("中文", "UTF-8")%>">使用者身份验证</a>  

    request-body的编码处理

    request-body只有在POST提交的方式下才会产生。request-body的编码方式由表单的enctype标签属性指定,同request-line一样,编码request-body时使用的字符集也是当前网页在浏览器上显示时所使用的字符集。request-body的编码过程由客户端浏览器自动完成,不需要额外的编程处理。

    服务器的处理

    相对于用户端,服务器端在接收到HTTP请求时提供了两种处理请求数据的方式:自动处理与不处理。
    服务器一般会自动处理application/x-www-form-urlencoded类型的数据(包括request-line及request-body中的数据),就servlet(Servlet类或JSP网页)而言,可以通过request对象的getParameter()或getParameterValues()取得这些数据。对于除此以外的其它MIME类型的数据,HTTP服务器则是将处理的过程直接交到了与HTTP请求相对应的servlet(Servlet类或JSP网页)身上。
    例如用户端有以下表单被提交:

    [xhtml] view plain copy

    <form action="checkUser.html?opt=xxx" method="POST">    

    <input type="text" name="username" value="yyy"/>    

    <input type="text" name="username" value="zzz"/>    

    <inupt type="submit" value="submit"/>    

    </form>  

    表单提交时经服务器端自动处理后与checkUser.html相对应的servlet(Servlet类或JSP网页)可以通过下面的方式取得数据:

    [java] view plain copy

    String opt = request.getParameter("opt");  

    String[] users = request.getParameterValues("username");  

    默认情况下,服务器对于接收到的application/x-www-form-urlencoded类型数据进行字符集为ISO-8859-1的URLDecoding处理,经过处理之后的字符串内码为ISO-8859-1。对于没有附加任何设置的HTTP服务器而言,我们的servlet在取得数据之后必须进行相应的解码处理,生成内码为UTF-16(unicode)的字符串。
    例如对于用户端请求数据中以UTF-8字符集进行URLEncoding的数据,servlet需要进行如下方式的解码:

    [java] view plain copy

    String opt = request.getParameter("opt");  

    if (opt!=null && !"".equals(opt)) {  

    opt = new String(opt.getBytes("ISO-8859-1"), "UTF-8");  

    }  

    为了避免这种额外的编码/解码处理,也就是说让服务器了解到用户端在URLEncoding时所使用的字符集,从而直接进行相应字符集的URLDecoding处理,不同的HTTP服务器提供了不同的解决方案。
    以Tomcat为例,Tomcat自动解码request-line的处理方式由Tomcat的配置文件server.xml指定。在server.xml中的Connector标签中提供了URIEncoding标签属性,只要为其指定解码用的字符集,Tomcat就会自动解码request-line中经过application/x-www-form-urlencoded编码处理的数据。例如:

    <Connector connectionTimeout="40000" port="8080" protocol="HTTP/1.1"
    URIEncoding="UTF-8" redirectPort="8443"/>

    Tomcat自动解码request-body的处理方式是设置request的characterEncoding值。如:

    request.setCharacterEncoding("UTF-8");

    但是这一操作必须提前在filter中完成,在servlet中使用此方法已经不起作用了。filter的例子如下:

    [java] view plain copy

    import java.io.IOException;  

    import javax.servlet.Filter;  

    import javax.servlet.FilterChain;  

    import javax.servlet.FilterConfig;  

    import javax.servlet.ServletException;  

    import javax.servlet.ServletRequest;  

    import javax.servlet.ServletResponse;  

    public class CharacterEncodingFilter implements Filter {  

    private String encoding;  

    public CharacterEncodingFilter() {  

    encoding = null;  

    }  

    public void destroy() {  

    encoding = null;  

    }  

    public void doFilter(ServletRequest request, ServletResponse response,  

    FilterChain chain) throws IOException, ServletException {  

    request.setCharacterEncoding(encoding);  

    chain.doFilter(request, response);  

    }  

    public void init(FilterConfig filterConfig) throws ServletException {  

    encoding = filterConfig.getInitParameter("encoding");  

    if (encoding == null || "".equals(encoding)) {  

    encoding = "UTF-8";  

    }  

    }  

    }  

    我们可以在web.xml使用这个filter。web.xml的相应配置如下:

    [xhtml] view plain copy

    <filter>  

    <filter-name>Character Encoding Filter</filter-name>  

    <filter-class>  

    CharacterEncodingFilter  

    </filter-class>  

    <init-param>  

    <param-name>encoding</param-name>  

    <param-value>UTF-8</param-value>  

    </init-param>  

    </filter>  

    <filter-mapping>  

    <filter-name>Character Encoding Filter</filter-name>  

    <url-pattern>/*</url-pattern>  

    </filter-mapping>  

    通过上述两种方式的预处理,在servlet中取出的数据可以不必进行ISO-8859-1解码而直接使用。

    字符集的选择

    在处理application/x-www-form-urlencoded类型的数据过程中,需要注意的另一个问题是字符集的选择问题。如上所述,不论是request-line还是request-body,其URLEncoding所使用的字符集都是当前网页在浏览器上显示时所使用的字符集。而这个信息又是HTTP服务器端生成HTML网页时,在HTTP响应中提供的。
    当HTTP服务器接收到一个HTTP请求时,服务器总是需要向用户端发送一个HTTP响应。HTTP响应数据与HTTP请求数据格式相同,同样由以下几个部分组成:

    <response-line>
    <headers>
    <CRLF>
    [<response-body><CRLF>]

    下面描述的是请求一个HTML网页数据时服务器的响应信息:

    HTTP/1.1 200 OK
    Server: Apache-Coyote/1.1
    Content-Type: text/html;charset=UTF-8
    Content-Length: 265
    Date: Thu, 17 Dec 2009 05:20:36 GMT

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>test</title>
    </head>
    <body>
    <h1>Hello World</h1>
    </body>
    </html>
    [End]

    其中headers的Content-Type指定了数据流的数据格式以及显示用的字符集。这一指标可以通过以下几种方式指定:
    1. HTML网页
    在HTML网页的<head></head>中存在多个<meta/>标签,其中可以设置Content-Type。例如:

    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

    2. JSP网页
    JSP网页中,除了<meta/>标签之外,还需要在JSP网页头部设置如下代码:

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

    3. Servletç±»
    如果要在Servlet类中通过response向用户端传送HTML数据,需要在传送前指定Content-Type。代码如下:

    response.setContentType("text/html;charset=UTF-8");

    通过上述三种方式,可以确保响应数据传送到用户端浏览器时,浏览器使用正确解码方式和字符集显示其内容。

    结束语

    总之,Content-Type是联系用户端与服务器端的纽带,通过这一指标,双方得以对相关的数据进行正确的编码与解码。只要了解了Content-Type的作用以及使用方法,乱码问题就会迎刃而解。

温馨提示:内容为网友见解,仅供参考
无其他回答

javaweb怎么处理中文乱码问题
采用相同的格式去接收(ISO-8859-1),然后用能解析的编码(utf-8)去转换。这样我们就能得到能兼容中文的格式了。这样处理之后发往前台。注意:发往前台的时候也需要设置一下 resp.setContentType("text\/html;charset=utf-8");\/\/设置页面的字符编码,解决界面显示中文乱码的问题 protected void service(...

一招教你如何解决中文乱码
方法二:借助过滤器处理过滤器是一个在浏览器与web资源之间起桥梁作用的组件,它负责预处理请求和后处理响应。下面详细介绍如何利用过滤器解决乱码问题。过滤器的基本概念:它在请求和响应之间进行过滤,功能众多,包括处理乱码。要使用过滤器,首先创建一个过滤器类,然后有两种配置方式:web.xml文件配置:...

javaweb怎么处理中文乱码
(1)response乱码问题 解决方法:在网上很有效的解决方法是添加:response.setCharacterEncoding("UTF-8");解决不了,后来又搜到一条解决方法是:response.setContentType("text\/html;charset=utf-8");或者 response.setHeader("content-type","text\/html;charset=UTF-8");告诉浏览器用utf-8解析。(...

java web工程里面中文乱码了
java web工程出现中文乱码可以有如下解决方案:1、项目文本文件默认编码:【右击项目】->【Properties】->【Resource】->【Text file encoding】2、文件默认编码:默认使用项目的默认编码:【右击文件】->【Properties】->【Resource】->【Text file encoding】3、 JSP 文件编码:【右击文件】->【Propertie...

java web乱码怎么解决
解决方式:下载commons-fileupload-1.1.1.jar 这个版本的jar已经解决了这些bug。但是取出内容时仍然需要对取出的字符进行从iso8859-1到utf-8转码。已经能得到正常所有汉字以及字符。Java代码关于url请求,接受参数的乱码 url的编码格式,取决于上面所说的URIEncoding=”UTF-8”。如果设定了这个编码格式,...

如何解决Java WEB应用中的乱码问题
如果处理不当就会出现乱码问题。用户端的处理 当用户端发出一个HTTP请求时,一个如下格式的数据将发送给服务器端:<request-line <headers<CRLF[<request-body<CRLF]关于HTTP请求的格式,可以在HTTP协议与HTML表单(再谈GET与POST的区别)中了解更多的内容。在此,request-line与request-body均需要进行相应...

如何解决JavaWeb乱码问题
[java] view plain copy String opt = request.getParameter("opt");if (opt!=null && !"".equals(opt)) { opt = new String(opt.getBytes("ISO-8859-1"), "UTF-8");} 为了避免这种额外的编码\/解码处理,也就是说让服务器了解到用户端在URLEncoding时所使用的字符集,从而直接进行相应...

怎么解决读取properties文件中文乱码
解决Java Web项目中.properties文件中文乱码问题的步骤如下:首先,打开Myeclipse,定位到窗口选项,点击"Preference"。在弹出的设置窗口中,找到并展开"General"部分,然后选择"Content Types"。在右侧的列表中,找到并点击"Text",接着展开,找到"java Properties File"选项。重要的是,你需要将文件的编码...

java WEB项目的jsp页面显示的时候乱码。在别人电脑上都显示的是正常的...
你要右键项目设置编码为UTF-8,jsp乱码的话,你要先把未乱码的代码复制到txt文件,再到项目里重创键jsp页面,再txt里的未乱码的代码复制黏贴即可

java web和html是否可以兼容,以及乱码问题的解析。
可以兼容,乱码问题很容易解决,只要保持如下原则:1. 服务器编码 2. 数据库编码 3. 页面编码 4. servlet编码(这个通常采用自定义过滤器统一过滤即可或者直接采用spring等框架提供的编码设置过滤器)5. java文件、页面文件等(推荐)只要保持上述5个方面编码一致即可(通常utf-8或者gbk、gb2312、gb18030...

相似回答