`

【消除盲点系列】(二)JavaWeb开发之编码问题

阅读更多
声明:【消除盲点系列】文章内容全部整理自网络,出处众多,无法一一罗列 ,敬请谅解!欢迎讨论、指正,欢迎转载!

//补充资料@2012/02/15
http://unicode.org/faq/utf_bom.html

涉及到编码的位置
(1)html页面、浏览器
(2)应用服务器
(3)JSP、Servlet
(4)文件系统
(5)数据库驱动
(6)数据库管理系统
----------------------------------------------------
(1)-(4)html页面、浏览器;应用服务器;JSP、Servlet;文件系统
html页面<head>中设置:
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
浏览器会采用charset的指定值对从server端获取的字节流进行编码、呈现。

服务器都有一个默认的编码,如果请求的页面没有做上面的设置,则服务器使用默认的编码解析请求。

存文件必须以一种编码存;读文件也必须以一种编码读,如不特别设置,去系统默认的编码,中文windows为GBK编码。

第一,从.java->.class过程是,先编写.java文件并按某种编码方式保存,然后用javac方法编译此文件,注意如.java没按系统默认编码保存则要带encoding参数指明实际编码,否则出错,生成的.class文件存为系统默认编码。

从.jsp->.java->.class,先存为某种编码的.jsp文件,然后tomcat根据pageEncoding读取并转化为servlet存为系统默认编码,然后同上面.java->.class过程。

第二,IDE的encoding为对系统下文件打开的解码方式或保存的编码方式。
特例:如果.jsp文件有<%@ page language="java" pageEncoding="UTF-8"%>,则eclipse会自动存为UTF-8方式,不管eclipse全局的encoding设置。

第三,pageEncoding="UTF-8"表示此文件的编码方式,必须与此文件存储方式一致(所以eclipse会首选根据它来存文件),tomcat根据这个来读此.jsp文件并编译为servlet。
contentType="text/html;charset=UTF-8"表示当浏览器得到此文件时以什么方式解码。例如:
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ page contentType="text/html;charset=iso8859-1"%>
<html>
<head>
<title>test</title>
</head>
<body>
我是个好人
</body>
</html>

会产生乱码,因为存为UTF-8的文件被解码为iso8859-1,这样 如有中文肯定出乱码。

至此,页面应为:
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ page contentType="text/html;charset=UTF-8"%>
<html>
<head>
<title>中文问题</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
</html>

第四,request.setCharacterEncoding("UTF-8")是把提交内容的字符集设为UTF-8
response.setCharacterEncoding("UTF-8")可以把页面中的<%@ page contentType="text/html;charset=iso8859-1"%>换为charset=UTF-8,是给告诉浏览器我这个文件的编码方式。

第五,表单提交:无论何种表单提交都可以在后台的java文件中通过String des = new String(s.getBytes("iso8859-1"),"UTF-8");来转换成你想要的UTF-8编码方式。但如果每处都加词句太麻烦,故分post和get两种方式区分提交(tomcat5以后分开处理,之前处理方式一样,即都可以用request.setCharacterEncoding("UTF-8")方法处理,不过tomcat5以后get提交方法用此语句无效)。
1,post提交的数据:
程序加上org.springframework.web.filter.CharacterEncodingFilter过滤器.
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>

<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*.html</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping> 


因为规范要求浏览器提交数据都要用utf8编码,所以这里设置编码方式为UTF8.

特别注意:
a,这个过滤器只是简单的调用:request.setCharacterEncoding(this.encoding);
在这个语句之前不能调用任何的request.getParameter()方法,否则会设置tomcat的缺省字符集为"ISO-8859-1",并且使setCharacterEncoding的调用失效.所以在这个过滤器之前的过滤器中不能有对getParameter这类方法的调用,比较安全的做法就是把这个过滤器尽量靠前放.
b,在server.xml中不能加上<Valve className="org.apache.catalina.valves.RequestDumperValve"/>
这个value也设置tomcat的缺省字符集为"ISO-8859-1",使setCharacterEncoding的调用失效.可能其他的value也有这个问题,我没有测试过.
如果要观察http请求参数,可以考虑用过滤器或者其他工具,例如ethereal(http://www.ethereal.com/)

2,get提交的数据:
两种情况:
a,如果从地址栏直接输入汉字,则一般编码为"GBK",需要用
new String(request.getParameter("something").getBytes("ISO-8859-1"),"GBK")
取出
b,如果是页面超连接连接中带的汉字,则编码根据页面编码的不同而不同,如果页面的
content="text/html; charset=utf-8",则在tomcat/conf/server.xml中的配置文件中:
<!-- Define a non-SSL Coyote HTTP/1.1 Connector on port 8080 -->
<Connector port="8080"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000" useBodyEncodingForURI="true"
disableUploadTimeout="true" /> 

加上:useBodyEncodingForURI="true"即可正常使用getParameter取出正确内容.
如果content="text/html; charset=GBK",需用
new String(request.getParameter("something").getBytes("ISO-8859-1"),"GBK")
取出,其他情况类似.

(5)-(6)数据库相关
//TODO
分享到:
评论

相关推荐

    JavaWeb 开发之路经验总结

    JavaWeb 开发之路经验总结

    javaWeb开发技术大全

    JavaWeb开发技术大全涵盖了许多关键概念,这些概念构成了现代Web应用程序的基础。这包括但不限于服务器端编程、客户端交互、数据库连接以及安全控制等。以下是一些核心知识点的详细说明: 1. **Servlet与JSP**:...

    JavaWeb开发实战源码

    JavaWeb开发实战源码是学习和理解Web应用程序开发的一个重要资源。这个压缩包可能包含了从基础到高级的各种JavaWeb项目实例,涵盖了从搭建环境、创建动态网页、处理HTTP请求到数据库交互等一系列步骤。通过深入研究...

    Tomcat与JavaWeb开发技术详解源码

    Tomcat与JavaWeb开发技术详解书本的源代码。

    JavaWeb开发文档集合

    在IT行业中,JavaWeb开发是构建企业级应用的重要技术栈,涵盖了从前端界面到后端服务的全方位开发工作。这份"JavaWeb开发文档集合"显然是一份宝贵的资源,包含了多种核心技术的指南,可以帮助开发者深入理解和掌握...

    Javaweb开发技术详解

    JavaWeb开发技术是现代互联网应用开发的重要组成部分,汪大乐所著的《Javaweb开发技术详解》一书深入浅出地介绍了这一领域的核心概念和技术。JavaWeb开发主要涉及Servlet、JSP、JSTL、过滤器、监听器、MVC设计模式...

    JavaWeb开发典型模块大全完整源码

    JavaWeb开发是构建基于互联网应用程序的关键技术,它涵盖了服务器端编程、数据库交互、网页动态内容生成等多个方面。这个"JavaWeb开发典型模块大全完整源码"提供了全面的学习资源,可以帮助开发者深入理解JavaWeb的...

    javaWeb开发PPT大全

    JavaWeb开发是软件行业中一个重要的领域,主要用于构建基于Web的应用程序。这个"javaWeb开发PPT大全"包含17个章节的PPT,是学习和理解JavaWeb技术的理想资源。以下将详细介绍这些章节可能涵盖的知识点: 1. **...

    JavaWeb页面过滤器之编码过滤

    在JavaWeb开发中,页面编码过滤是一个至关重要的环节,它主要解决的是网页中字符编码不一致导致乱码的问题。在给定的标题“JavaWeb页面过滤器之编码过滤”和描述中,我们可以深入探讨JavaWeb中的编码过滤器,以及...

    JavaWeb开发实战经典(基础篇)源码

    1. **Java基础**:JavaWeb开发首先建立在Java语言的基础之上,包括面向对象编程、类和对象、封装、继承、多态等概念。理解这些基础是构建JavaWeb应用的基石。 2. **Servlet技术**:Servlet是JavaWeb开发的核心,...

    Tomcat与JavaWeb开发技术详解-随书源码

    《Tomcat与JavaWeb开发技术详解》一书的随书源码包含了大量的示例和练习,旨在帮助读者深入理解如何在实际开发环境中运用Tomcat服务器和JavaWeb技术。以下是对这些关键技术点的详细阐述: **Tomcat服务器** Tomcat...

    JavaWeb开发权限问题

    在JavaWeb开发中,权限问题是一个至关重要的环节,它涉及到系统的安全性、用户访问控制以及数据保护。本篇文章将深入探讨JavaWeb开发中的权限管理,帮助开发者理解和实施有效的权限设置。 一、角色与权限模型 在...

    javaweb开发学习手册

    《JavaWeb开发学习手册》是一本全面覆盖JavaWeb开发核心概念和技术的手册,旨在帮助初学者及有经验的开发者深入理解和掌握这一领域的关键知识点。标签"javaweb开发"明确了手册的主要焦点,即使用Java语言进行Web应用...

    JavaWEB项目开发案例精粹

    ### JavaWEB项目开发案例精粹 #### 一、概述 《JavaWEB项目开发案例精粹》是一本专注于JavaWEB技术领域的书籍,它汇集了大量的实际项目案例,并提供了完整的源代码供读者学习与参考。本书旨在帮助读者更好地理解和...

    javaweb开发内幕

    在JavaWeb开发中,开发者需要理解并掌握一系列技术,包括Servlet、JSP、MVC框架、数据库交互、安全机制以及性能优化等。以下是对这些关键知识点的详细解释: 1. **Servlet**:Servlet是JavaEE平台中的核心组件,它...

    JavaWeb开发技术大全光盘(3)

    本资源"JavaWeb开发技术大全光盘(3)"包含了一系列与JavaWeb相关的学习资料,适合初学者和有一定经验的开发者参考学习。 首先,我们看到的文件名如"LoginFrame.class"、"welcome.class"等,这些都是Java编译后的...

    Tomcat与JavaWeb开发技术详解(第二版)源码

    《Tomcat与JavaWeb开发技术详解(第二版)源码》是针对JavaWeb开发者的一份珍贵资源,它包含了深入理解Tomcat服务器以及如何利用它进行Web应用开发的关键知识点。在这个压缩包中,我们很可能会找到关于Tomcat架构、...

    JavaWeb开发第一天

    在“JavaWeb开发第一天”这个主题中,我们主要探讨的是JavaWeb开发的基础概念和技术栈,这对于初学者或者希望深入理解Web应用开发的开发者至关重要。JavaWeb是Java技术在Web领域中的应用,它允许开发者创建动态、...

    JavaWeb开发典型模块大全源码

    JavaWeb开发是构建基于Web的应用程序的技术集合,它结合了Java语言的强大功能和Web的分布式特性。本资源“JavaWeb开发典型模块大全源码”涵盖了从基础到高级的多个重要模块,提供了完整的源代码,适合学习者深入理解...

    JavaWeb开发技术-解决中文输出乱码问题.pptx

    JavaWeb开发技术-解决中文输出乱码问题 ...解决中文输出乱码问题是JavaWeb开发中一个非常重要的问题,需要正确地设置编码方式、处理中文字符的输入和输出,并注意统一的编码方式和浏览器的编码方式。

Global site tag (gtag.js) - Google Analytics