WEB开发中的字符编码问题分析与解决。

来源:互联网 发布:windows loader v2.5 编辑:程序博客网 时间:2024/06/05 10:36

转载自:http://hi.baidu.com/sefrank/item/4e7cf73c8e9e1c24b2c0c596

中文乱码是web开发初学者最头疼的问题之一。其实只要了解浏览器、web容器的编码机制,就能灵活的解决问题。

一、HTTP请求/响应消息正文的默认编码
    如果没有指定字符编码,Servlet规范要求,采用ISO-8859-1编码。HTTP(请求或响应)的Content-Type头字段用来指定字符编码。例如这样Content-Type:text/html;charset=ISO-8859-1,其中明确指出,正在使用默认设置(ISO-8859-1)。
    Servlet(JSP页面)请求的字符编码处理方式是相同的,但响应的字符编码有点不同。对于标准语法的JSP页面,默认响应字符集通常是ISO-8859-1,而对于那些XML语法,它是UTF-8。(这是默认情况,开发人员任何时候都应该明确指定字符编码)。

二、GET/POST方法的默认编码
1)GET:
    HTTP查询字符串(GET方法传的参数)默认使用US-ASCII字符集。US-ASCII以外的字符必须编码使用%转义序列:每个字节被编码为一个%加上两个十六进制数。例如,空格(US-ASCII字符代码97=0x20)编码为%20。
    ISO-8859-1和ASCII在字符编码为0x20到0x7E的区间是兼容的,所以他们经常互换使用。大多数浏览器采用ISO-8859-1为默认的字符串编码。
2)POST:
    HTTP请求和响应消息正文(POST方法传的内容)的默认编码是ISO-8859-1)。这是默认情况,前面说过,开发人员应该通过设定消息头(设定Content-type)来指定编码方式,大多数浏览器都是根据页面的Content-type来决定POST数据(例如method="post"的表单)的编码。

三、如何设定POST/GET的编码
1)GET:
    Tomcat使用ISO-8859-1作为URL默认的字符编码,包括查询字符串(GET方法提交的参数)。
    可以通过修改server.xml来改变默认编码,在<Connector>元素中添加或修改属性: URIEncoding="UTF-8" 或者 useBodyEncodingForURI="true"(使用与POST方法相同的编码)。不推荐修改<Connector>元素,对于带有中文参数的URL,可以通过编码解决。
    方式一:
    客户端: encodeURI(encodeURI(url));//第二次编码把 "%" 编码成 "%25";
    后台解码: URLDecoder.decode(request.getParameter("name"), "UTF-8");
    方式二:
    客户端:不做任何处理,照常提交;
    服务端解码:URLDecoder.decode(URLEncoder.encode(request.getParameter("name"),"ISO-8859-1"),"UTF8");
2)POST:
    大多数情况下,通过设定页面的Content-type即设定了POST的编码。HTML: <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> JSP: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>。
    但是也有客户端没有明确指定编码的情况,可以通过在过滤器设定字符编码的方式解决。tomcat 7中有现成的类可以使用:org.apache.catalina.filters.SetCharacterEncodingFilter 核心代码就是request.setCharacterEncoding("UTF-8");
    //注意这行代码必须写在任何request.getParameter之前,否则不起作用。这种方式在SpringMVC开发中,@ModelAttribute注解已经获取参数生成了请求参数对象,所以在方法主题中使用将不起作用。

 

 

原创粉丝点击