`
julylin
  • 浏览: 49547 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

编码内容整理

    博客分类:
  • J2EE
阅读更多
response.setContentType
设置发送到客户端的响应的内容类型,可以包括字符编码说明.
也就是说在服务器端坐了这个设置,那么他将在浏览器端起到作用,在你打开浏览器时决定编码方式
如果该方法在response.getWriter()被调用之前调用,那么响应的字符编码将仅从给出的内容类型中设置。该方法如果在response.getWriter()被调用之后或者在被提交之后调用,将不会设置响应的字符编码,在使用http协议的情况中,该方法设置 Content-type实体报头 

response.setCharacterEncoding设置响应的编码
如果服务器端使用response.setContentType设置了编码格式,
那么应该使用 response.setCharacterEncoding指定的编码格式,这样就会把之前的设置屏蔽掉

request.setCharacterEncoding()是设置从request中取得的值或从数据库中取出的值
response.setContentType( "text/html;charset=gb2312 ")是设置页面中为中文编码
前者是设置动态文字(参数,数据库),后者设置页面静态文字

首先,说说JSP/Servlet中的几个编码的作用。

在JSP/Servlet中主要有以下几个地方可以设置编码,pageEncoding="UTF-8"、contentType="text/html;charset=UTF-8"、request.setCharacterEncoding("UTF-8")和response.setCharacterEncoding("UTF-8"),其中前两个只能用于JSP中,而后两个可以用于JSP和Servlet中。

1、pageEncoding="UTF-8"的作用是设置JSP编译成Servlet时使用的编码。

众所周知,JSP在服务器上是要先被编译成Servlet的。pageEncoding="UTF-8"的作用就是告诉JSP编译器在将JSP文件编译成Servlet时使用的编码。通常,在JSP内部定义的字符串(直接在JSP中定义,而不是从浏览器提交的数据)出现乱码时,很多都是由于该参数设置错误引起的。例如,你的JSP文件是以GBK为编码保存的,而在JSP中却指定pageEncoding="UTF-8",就会引起JSP内部定义的字符串为乱码。

另外,该参数还有一个功能,就是在JSP中不指定contentType参数,也不使用response.setCharacterEncoding方法时,指定对服务器响应进行重新编码的编码。

2、contentType="text/html;charset=UTF-8"的作用是指定对服务器响应进行重新编码的编码。

在不使用response.setCharacterEncoding方法时,用该参数指定对服务器响应进行重新编码的编码。3、request.setCharacterEncoding("UTF-8")的作用是设置对客户端请求进行重新编码的编码。

该方法用来指定对浏览器发送来的数据进行重新编码(或者称为解码)时,使用的编码。

4、response.setCharacterEncoding("UTF-8")的作用是指定对服务器响应进行重新编码的编码。

服务器在将数据发送到浏览器前,对数据进行重新编码时,使用的就是该编码。

其次,要说一说浏览器是怎么样对接收和发送的数据进行编码的

response.setCharacterEncoding("UTF-8")的作用是指定对服务器响应进行重新编码的编码。同时,浏览器也是根据这个参数来对其接收到的数据进行重新编码(或者称为解码)。所以在无论你在JSP中设置response.setCharacterEncoding("UTF-8")或者response.setCharacterEncoding("GBK"),浏览器均能正确显示中文(前提是你发送到浏览器的数据编码是正确的,比如正确设置了pageEncoding参数等)。读者可以做个实验,在JSP中设置response.setCharacterEncoding("UTF-8"),在IE中显示该页面时,在IE的菜单中选择"查看(V)"à"编码(D)"中可以查看到是" Unicode(UTF-8)",而在在JSP中设置response.setCharacterEncoding("GBK"),在IE中显示该页面时,在IE的菜单中选择"查看(V)"à"编码(D)"中可以查看到是"简体中文(GB2312)"。

浏览器在发送数据时,对URL和参数会进行URL编码,对参数中的中文,浏览器也是使response.setCharacterEncoding参数来进行URL编码的。以百度和GOOGLE为例,如果你在百度中搜索"汉字",百度会将其编码为"%BA%BA%D7%D6"。而在GOOGLE中搜索"汉字",GOOGLE会将其编码为"%E6%B1%89%E5%AD%97",这是因为百度的response.setCharacterEncoding参数为GBK,而GOOGLE的的response.setCharacterEncoding参数为UTF-8。

浏览器在接收服务器数据和发送数据到服务器时所使用的编码是相同的,默认情况下均为JSP页面的response.setCharacterEncoding参数(或者contentType和pageEncoding参数),我们称其为浏览器编码。当然,在IE中可以修改浏览器编码(在IE的菜单中选择"查看(V)"à"编码(D)"中修改),但通常情况下,修改该参数会使原本正确的页面中出现乱码。一个有趣的例子是,在IE中浏览GOOGLE的主页时,将浏览器编码修改为"简体中文(GB2312)",此时,页面上的中文会变成乱码,不理它,在文本框中输入"汉字",提交,GOOGLE会将其编码为"%BA%BA%D7%D6",可见,浏览器在对中文进行URL编码时,使用的就是浏览器编码。

弄清了浏览器是在接收和发送数据时,是如何对数据进行编码的了,我们再来看看服务器是在接收和发送数据时,是如何对数据进行编码的。

对于发送数据,服务器按照response.setCharacterEncoding—contentType—pageEncoding的优先顺序,对要发送的数据进行编码。

对于接收数据,要分三种情况。一种是浏览器直接用URL提交的数据,另外两种是用表单的GET和POST方式提交的数据。

因为各种WEB服务器对这三种方式的处理也不相同,所以我们以Tomcat5.0为例。

无论使用那种方式提交,如果参数中包含中文,浏览器都会使用当前浏览器编码对其进行URL编码。

对于表单中POST方式提交的数据,只要在接收数据的JSP中正确request.setCharacterEncoding参数,即将对客户端请求进行重新编码的编码设置成浏览器编码,就可以保证得到的参数编码正确。有写读者可能会问,那如何得到浏览器编码呢?上面我们提过了,在默认请情况下,浏览器编码就是你在响应该请求的JSP页面中response.setCharacterEncoding设置的值。所以对于POST表单提交的数据,在获得数据的JSP页面中request.setCharacterEncoding要和生成提交该表单的JSP页面的response.setCharacterEncoding设置成相同的值。

对于URL提交的数据和表单中GET方式提交的数据,在接收数据的JSP中设置request.setCharacterEncoding参数是不行的,因为在Tomcat5.0中,默认情况下使用ISO-8859-1对URL提交的数据和表单中GET方式提交的数据进行重新编码(解码),而不使用该参数对URL提交的数据和表单中GET方式提交的数据进行重新编码(解码)。要解决该问题,应该在Tomcat的配置文件的Connector标签中设置useBodyEncodingForURI或者URIEncoding属性,其中useBodyEncodingForURI参数表示是否用request.setCharacterEncoding参数对URL提交的数据和表单中GET方式提交的数据进行重新编码,在默认情况下,该参数为false(Tomcat4.0中该参数默认为true);URIEncoding参数指定对所有GET方式请求(包括URL提交的数据和表单中GET方式提交的数据)进行统一的重新编码(解码)的编码。URIEncoding和useBodyEncodingForURI区别是,URIEncoding是对所有GET方式的请求的数据进行统一的重新编码(解码),而useBodyEncodingForURI则是根据响应该请求的页面的request.setCharacterEncoding参数对数据进行的重新编码(解码),不同的页面可以有不同的重新编码(解码)的编码。所以对于URL提交的数据和表单中GET方式提交的数据,可以修改URIEncoding参数为浏览器编码或者修改useBodyEncodingForURI为true,并且在获得数据的JSP页面中request.setCharacterEncoding参数设置成浏览器编码。

下面总结下,以Tomcat5.0为WEB服务器时,如何防止中文乱码。

1、对于同一个应用,最好统一编码,推荐为UTF-8,当然GBK也可以。

2、正确设置JSP的pageEncoding参数

3、在所有的JSP/Servlet中设置contentType="text/html;charset=UTF-8"或response.setCharacterEncoding("UTF-8"),从而间接实现对浏览器编码的设置。

4、对于请求,可以使用过滤器或者在每个JSP/Servlet中设置request.setCharacterEncoding("UTF-8")。同时,要修改Tomcat的默认配置,推荐将useBodyEncodingForURI参数设置为true,也可以将URIEncoding参数设置为UTF-8(有可能影响其他应用,所以不推荐)。

(1)Content-Type的作用

该实体头的作用是让服务器告诉浏览器它发送的数据属于什么文件类型。

例如:当Content-Type 的值设置为text/html和text/plain时,前者会让浏览器把接收到的实体内容以HTML格式解析,后者会让浏览器以普通文本解析.

(2)Content-Disposition 的作用

当Content-Type 的类型为要下载的类型时 , 这个信息头会告诉浏览器这个文件的名字和类型。

在讲解这个内容时,张老师同时讲出了解决中文文件名乱码的解决方法,平常想的是使用getBytes() , 实际上应使用email的附件名编码方法对文件名进行编码,但IE不支持这种作法(其它浏览器支持) , 使用javax.mail.internet.*包的MimeUtility.encodeWord("中文.txt")的方法进行编码。

Content-Disposition扩展头的例子:

<%@ page pageEncoding="GBK" contentType="text/html;charset=utf-8" import="java.util.*,java.text.*" %>

<%=DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, Locale.CHINA).format(new Date())

%>

<%

               response.setHeader("Content-Type","video/x-msvideo");

               response.setHeader("Content-Disposition", "attachment;filename=aaa.doc");

%>

Content-Disposition中指定的类型是文件的扩展名,并且弹出的下载对话框中的文件类型图片是按照文件的扩展名显示的,点保存后,文件以filename的值命名,保存类型以Content中设置的为准。

注意:在设置Content-Disposition头字段之前,一定要设置Content-Type头字段。

(3)Authorization头的作用

Authorization的作用是当客户端访问受口令保护时,服务器端会发送401状态码和WWW-Authenticate响应头,要求客户机使用Authorization来应答。

例如:

<%@ page pageEncoding="GBK" contentType="text/html;charset=utf-8" import="java.util.*,java.text.*" %>

<%=DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, Locale.CHINA).format(new Date())

%>

<%

response.setStatus(401);

response.setHeader("WWW-Authenticate", "Basic realm=\"Tomcat Manager Application\"");

%>

3.如何实现文件下载

要实现文件下载,我们只需要设置两个特殊的相应头,它们是什么头?如果文件名带中文,该如何解决?

两个特殊的相应头:

----Content-Type:       application/octet-stream

----Content-Disposition: attachment;filename=aaa.zip

例如:

response.setContentType("image/jpeg");response.setHeader("Content- Disposition","attachment;filename=Bluehills.jpg");

如果文件中filename参数中有中文,则就会出现乱码。

解决办法:

(1)MimeUtility.encodeWord("中文.txt");//现在版本的IE还不行

(2)new String("中文".getBytes("GB2312"),"ISO8859- 1");//实际上这个是错误的

4. 测试并分析文件名乱码问题

response.setHeader()下载中文文件名乱码问题

response.setHeader("Content-Disposition", "attachment; filename=" + java.net.URLEncoder.encode(fileName, "UTF-8"));

下载的程序里有了上面一句,一般在IE6的下载提示框上将正确显示文件的名字,无论是简体中文,还是日文。不过当时确实没有仔细测试文件名为很长的中文文件名的情况。现如今经过仔细测试,发现文字只要超过17个字,就不能下载了。分析如下:

一. 通过原来的方式,也就是先用URLEncoder编码,当中文文字超过17个时,IE6 无法下载文件。这是IE的bug,参见微软的知识库文章 KB816868 。原因可能是IE在处理 Response Header 的时候,对header的长度限制在150字节左右。而一个汉字编码成UTF-8是9个字节,那么17个字便是153个字节,所以会报错。而且不跟后缀也不对.

二. 解决方案:将文件名编码成ISO8859-1是有效的解决方案,代码如下:

response.setHeader( "Content-Disposition", "attachment;filename=" + new String( fileName.getBytes("gb2312"), "ISO8859-1" ) );

在确保附件文件名都是简体中文字的情况下,那么这个办法确实是最有效的,不用让客户逐个的升级IE。如果台湾同胞用,把gb2312改成big5就行。但现在的系统通常都加入了 国际化的支持,普遍使用UTF-8。如果文件名中又有简体中文字,又有繁体中文,还有日文。那么乱码便产生了。另外,在上Firefox (v1.0-en)下载也是乱码。

三. 参看邮件中的中文附件名的形式,用outlook新建一个带有中文附件的邮件,然后看这个邮件的源代码,找到:

Content-Disposition: attachment;

filename="=?gb2312?B?0MK9qCDOxLG+zsS1tS50eHQ=?="

用这个filename原理上就可以显示中文名附件,但是现在IE并不支持,Firefox是支持的。尝试使用 javamail 的MimeUtility.encode()方法来编码文件名,也就是编码成 =?gb2312?B?xxxxxxxx?= 这样的形式,并从 RFC1522 中找到对应的标准支持。

折中考虑,结合了一、二的方式,代码片断如下:

String fileName = URLEncoder.encode(atta.getFileName(), "UTF-8");

/*

* see http://support.microsoft.com/default.aspx?kbid=816868

*/

if (fileName.length() > 150) {

String guessCharset = xxxx

//根据request的locale 得出可能的编码,中文操作系统通常是gb2312

fileName = new String(atta.getFileName().getBytes(guessCharset), "ISO8859-1");

}

response.setHeader("Content-Disposition", "attachment; filename=" + fileName);

编码转换的原理:

首先在源程序中将编码设置成GB2312字符编码,然后将源程序按Unicode编码转换成字节码加载到内存中(java加载到内存中的字节码都是Unicode编码),然后按GB2312编码获得中文字符串的字节数组,然后生成按ISO8859-1编码形式的Unicode字符串(这时的4个字节就变成了8个字节,高位字节补零),

java培训   北京java培训 java培训班   java就业培训 java培训机构 软件培训 最好的java培训

当在网络中传输时,因为setHeader方法中的字符只能按ISO8859-1传输,所以这时候就又把Unicode字符转换成了ISO8859-1的编码传到浏览器(就是把刚才高位补的零全去掉),这时浏览器接收到的ISO8859-1码的字符因为符合GB2312编码,所以就可以显示中文了。

5. jsp翻译成class时的编码问题

记事本中代码块1:

<%=

       "a中文".length()

%>

代码块2:

<%@ page pageEncoding="gbk"%>

<%=

       "a中文".length()

%>

为什么上面的输出值为5,改成下面的则输出3?

因为上面的代码没有添加该文件的编码说明 , WEB应用程序在将jsp翻译成class文件时 , 把该字符串的内容按默认的保存方式指定的编码ASCII码来算的,在UTF-8中,原ASCII字符占一个字节,汉字占两个字节,对应两个字符,长度就变成了5 , 而下面的是GBK编码, 一个汉字和一个英文都对应一个字符,得到结果就为3.


]


response.setHeader(...)文件名中有空格的时候

String fileName = StringUtils.trim(file.getName());

String formatFileName = encodingFileName(name);//在后面定义方法encodingFileName(String fileName);
response.setHeader("Content-Disposition", "attachment; filename=" + formatFileName );

//处理文件名中出现的空格

//其中%20是空格在UTF-8下的编码

public static String encodingFileName(String fileName) {
        String returnFileName = "";
        try {
            returnFileName = URLEncoder.encode(fileName, "UTF-8");
            returnFileName = StringUtils.replace(returnFileName, "+", "%20");
            if (returnFileName.length() > 150) {
                returnFileName = new String(fileName.getBytes("GB2312"), "ISO8859-1");
                returnFileName = StringUtils.replace(returnFileName, " ", "%20");
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            if (log.isWarnEnabled()) {
                log.info("Don't support this encoding ...");
            }
        }
        return returnFileName;
    }



response.setContentType()的String参数及对应类型 :

引用

<option value="image/bmp">BMP</option>  
<option value="image/gif">GIF</option>  
<option value="image/jpeg">JPEG</option>  
<option value="image/tiff">TIFF</option>  
<option value="image/x-dcx">DCX</option>  
<option value="image/x-pcx">PCX</option>  
<option value="text/html">HTML</option>  
<option value="text/plain">TXT</option>  
<option value="text/xml">XML</option>  
<option value="application/afp">AFP</option>  
<option value="application/pdf">PDF</option>  
<option value="application/rtf">RTF</option>  
<option value="application/msword">MSWORD</option>  
<option value="application/vnd.ms-excel">MSEXCEL</option>  
<option value="application/vnd.ms-powerpoint">MSPOWERPOINT</option>  
<option value="application/wordperfect5.1">WORDPERFECT</option>  
<option value="application/vnd.lotus-wordpro">WORDPRO</option>  
<option value="application/vnd.visio">VISIO</option>  
<option value="application/vnd.framemaker">FRAMEMAKER</option>  
<option value="application/vnd.lotus-1-2-3">LOTUS123</option>


分享到:
评论

相关推荐

    ICD-10恶性肿瘤编码整理版.doc

    部分内容中列出了许多恶性肿瘤的编码,例如C00.000外上唇恶性肿瘤、C00.001外上唇口红区恶性肿瘤、C00.002外上唇唇红缘恶性肿瘤等。这些编码都是根据恶性肿瘤的位置和类型进行分类和编码的。 在ICD-10恶性肿瘤编码...

    C#.NET编码规范整理文档[借鉴].pdf

    C#.NET编码规范整理文档[借鉴] 在C#.NET开发中,编码规范是非常重要的。一个良好的编码规范可以提高代码的可读性、维护性和重用性。本文档总结了C#.NET编码规范的重要内容,包括环境设置、命名规范、变量命名、事件...

    编码格式整理

    在IT行业中,编码格式是数据传输、存储和..."编码整理.xls"可能是对这些知识进行详细记录和整理的表格文件,对于理解和解决问题会有很大帮助。在实际工作中,我们应该不断学习和积累,确保在编码处理方面做到万无一失。

    Google-C++编码规范中文版(最新整理PDF版)

    Google-C++编码规范中文版详细涵盖了编写高质量C++代码的规则和建议,它为开发者提供了一个清晰的...这份文档的整理,能够为读者节省大量的整理时间,方便学习和应用Google的C++编码规范,提高个人和团队的编程效率。

    按GBK编码字库编号整理的7008个国家标准通用字表

    ### 按GBK编码字库编号整理的7008个国家标准通用字表解析 #### GBK编码简介 GBK(GB2312扩展版)是中华人民共和国国家标准GB2312-80《信息交换用汉字编码字符集·基本集》的扩展版本,全称《汉字内码扩展规范》,...

    .net编码规范整理规则

    .NET 编码规范是开发高质量、可维护代码的基础,它涉及到命名规范、编码规范、注释规约以及代码提交和提测规约等多个方面。以下是对这些规范的详细说明: **命名规范:** 1. 类名、接口名、枚举名、结构体名等全局...

    PEP8Python编码规范整理.pdf

    PEP 8 Python 编码规范整理 PEP 8 是 Python 官方编码规范,旨在统一 Python 代码风格和格式,提高代码的可读性和维护性。本文将详细介绍 PEP 8 的主要内容,包括缩进、代码组织、空格使用、注释、文档描述和命名...

    超级批量编码转换 1.0

    此外,软件可能还具备预览功能,允许用户在转换前查看源文件的内容和编码,确保转换的准确性。同时,转换过程中,可能会有错误提示,比如某些文件因为编码问题无法正常读取,软件会提供相应的警告,并让用户选择是否...

    lrc 歌词编码器

    - **格式优化**:对lrc文件进行格式整理,使其符合标准格式,便于播放器解析。 - **语言支持**:支持多语言歌词的编码转换,满足不同语种的需求。 【编码修改.exe】这个文件很可能是lrc歌词编码器的可执行程序,...

    编码规范整理

    注释应当简洁、明了,避免过多的描述代码本身实现的内容,而是关注为什么这样做。 3. **空格与缩进**:使用空格增强代码可读性,例如在操作符周围、逗号后面等。使用4个空格进行代码缩进,而非制表符,以保持一致性...

    D3.3.1信息化编码原则共4页.pdf-文档整理可打印

    这份“D3.3.1信息化编码原则共4页.pdf”文档,经过整理并可打印,显然是为了方便读者理解和应用这些原则。虽然无法直接查看文件内容,但我们可以根据通常的信息化编码原则来探讨相关知识点。 1. **编码的定义**:...

    OrBit-MES信息编码指导书

    ### 编码工作的内容 编码工作是一项系统而细致的任务,涉及多个步骤: 1. **建立编码体系与原则**:首先,需确立一套编码规则,确保编码的一致性和可扩展性。 2. **数据整理与分析**:对物料数据进行全面整理和...

    PEP8Python 编码规范

    PEP8是Python Enhancement Proposal 8的缩写,即Python增强提案的第8个提案。...这部分内容在整理知识点时需要特别注意,因为代码示例中的错误(如使用了错误的符号或格式)应当被纠正,以遵循PEP8规范。

    编码规范整理(第一版)1

    - 注释双斜线与内容间应有一个空格。 - 方法参数定义和传入时,逗号后面加空格,逗号前面无空格。 - 引号使用时,左引号前无空格,右引号后无空格,除非紧接右括号。 - 相邻逻辑不同的代码间插入空行提高可读性...

    M06-多摩川编码器说明书.pdf

    在解读文件内容时,由于OCR扫描技术可能存在识别错误或漏识别的情况,上述知识点是基于对文件中可识别内容的最佳理解整理得出。在具体应用时,应结合完整的说明书或制造商提供的技术资料,以确保对编码器的正确使用...

    Java语言编码规范

    在描述中提到此规范是由SUN公司的发布编码标准翻译整理而成,这意味着规范的权威性和行业内的广泛认可。编码规范对于软件生命周期的维护、代码的可读性以及源码的发布等方面均有重要作用。 Java源文件的知识点包括...

    区域名称、区域编码,天气编码整理(JSON)

    内容:列如 { "provice": "北京", "city": "朝阳", "adcode": "110105", "weather_code": "101010300" }, { "provice": "北京", "city": "顺义", "adcode": "110113", "weather_code": "101010400" }

    天气现象编码程序下载

    然而,由于描述的内容较为单一,我们无法获取更多关于该程序的具体细节,如其功能特性、用户界面、操作流程或者适用的操作系统等。 标签“天气”、“现象”、“编码”和“程序”提供了更多的线索。我们可以推测,这...

    javascript编码规范--整理版

    在HTML中放置标签时,应将其放在标签的底部,以避免阻塞页面内容的加载。同时,不需要指定language或type属性,因为MIME类型由服务器自动识别。 在代码格式方面,使用四个空格作为缩进,避免使用Tab,以防止因不同...

Global site tag (gtag.js) - Google Analytics