servlet的编码原理
编码问题:
在介绍编码问题前,先介绍一下java平台(JVM)上的编码转化情况。首先要说明的一点,在JVM中,即java平台上,运行的程序一定都是Unicode编码方式的。对于代码中的字符串常量,根据代码页的设置,转化为Unicode编码。对于输入,在输入进程序中JVM已经把输入的内容根据原先输入的编码方式转化为Unicode。若未指明,则是用系统默认的编码方式去转化为Unicode。对于输出,则是把Unicode编码按指定的编码方式输出,未指明则按系统默认编码输出。
编码问题出现的位置:
1.web浏览器发送请求 对于此请求中的参数要进行编码。区分get方式和post方式。
Get方式:由于get方式下的参数是放置于消息头中,而消息头是由浏览器根据自身特性去进行编码的,一般是UTF-8,但也有的浏览器不是。
Post方式:根据HTML页面Content-Type属性,如:Content-Type设置为“text/html;charset=”gb2312””则浏览器按gb2312去编码。
2.服务器接收到请求,这里假设服务器为Tomcat且运行的是servlet(jsp——jsp运行时仍编译成servlet,所以这里直接用servlet来表示)。
对于Post方式的请求,servlet默认会用ISO-8859-1将消息体中的参数转化为Unicode。如果是汉字,这是很不合理的,因为ISO-8859-1只有一个字节,是不支持汉字。所以在对HttpServletRequest对象利用getParameter()方法获取参数值时,必须先要用setCharacterEncoding()方法设置其解码方式,如req.setCharacterEncoding(“UTF-8”),这样调用的getParameter()方法会按UTF-8的方式把参数转化为Unicode。
Get方式的请求,首先要说明的,get方式下的请求,上述用setCharacterEncoding()方法设置解码方式是行不通的。其原因在于:get方式的请求参数放在消息头中,而消息头是在web容器的任何servlet接受前就已经先被web容器解释了,因为只有这样web容器才可以知道去具体调用哪个servlet。至于web容器如何解释消息的,serlvet标准中并没用明确规定,所以有的web容器按ISO-8859-1去解释为Unicode,有的则是按系统默认编码。
所以对于get方式下用setCharacterEncoding()方法设置解码方式是无用的。而相反,对于post方式,消息体一般是在第一次调用HttpServletRequest对象的getParameter()方法时,才开始实际处理。
所以由于get方式解码的未知性,一般所带参数都是不带中文的,若要带中文,则用post方式比较方便。但若要追求高效,非要用get方式时,则可以使用String类中getBytes()方法转为字节数,再用String(byte[],”编码”)构造函数去获取字符串。
3.服务器输出响应
服务器输出响应比较简单。由于servlet程序中所有字符都是统一码Unicode,所以输出时,按照response对象设定的Content-type中的字符集,servlet会自动根据其字符集将Unicode编码转为指定字符集输出。仍要说明的一定是,对于servlet程序中的常量字符串,则是按照代码页将其转化为Unicode。
编码问题的关键:
需要把接收的数据转化为Unicode编码,再由java处理;输出的数据由Unicode编码转化为指定编码后输出。
具体来说,对于接收的数据,web容器一般按默认的ISO-8859-1去解码。对于汉字,需要用GBK等去解码,再转换成Unicode。但对于URL后的参数无法设置解码方式,故一般不要用汉字。对于Post方式的消息体,可以用setCharacterEncoding方式去设置解码方式。
但JavaScript等脚本语言中,没用对编码方式转换成Unicode,而是直接保存、返回的。所以写代码过程中,若有汉字,一定要注意使代码页和HTML中的字符集相同。代码页的作用是:能够对程序中的常量字符串正确的解码。
=============================
http://www.cnblogs.com/dvking/archive/2012/01/02/2368703.html
servlet的编码原理的更多相关文章
- JSP/Servlet的编码原理
转自:http://janwer.iteye.com/blog/150226 首先,说说 JSP/Servlet 中的几个编码的作用 在 JSP/Servlet 中主要有以下几种设置编码的方式: pa ...
- servlet请求编码与响应编码问题(编码不一致可能会导致乱码)
html中的编码 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&g ...
- BASE64编码原理分析脚本实现及逆向案例
在互联网中的每一刻,你可能都在享受着Base64带来的便捷,但对于Base64的基础原理你又了解多少?今天小编带大家了解一下Base64编码原理分析脚本实现及逆向案例的相关内容. 01编码由来 数 ...
- 一篇文章彻底弄懂Base64编码原理
在互联网中的每一刻,你可能都在享受着Base64带来的便捷,但对于Base64的基础原理又了解多少?今天这篇博文带领大家了解一下Base64的底层实现. Base64的由来 目前Base64已经成为网 ...
- Base64图片编码原理,base64图片工具介绍,图片在线转换Base64
Base64图片编码原理,base64图片工具介绍,图片在线转换Base64 DataURI 允许在HTML文档中嵌入小文件,可以使用 img 标签或 CSS 嵌入转换后的 Base64 编码,减少 ...
- Spark MLlib特征处理:OneHotEncoder OneHot编码 ---原理及实战
http://m.blog.csdn.net/wangpei1949/article/details/53140372 Spark MLlib特征处理:OneHotEncoder OneHot编码 - ...
- 无线通信中FEC 编码原理及评价
转自:http://blog.csdn.net/wiznet2012/article/details/7492146 大家好,前面我们给大家介绍了无线通信中FEC编码原理(1)和(2),今天继续献上F ...
- 4B/5B编码原理
4B/5B编码原理 什么是4B/5B编码? 4B/5B编码是百兆以太网(即快速以太网)中线路层编码类型之一,就是用5bit的二进制数来表示4bit二进制数,映射方式如下表所示: 为什么要进行4B/5B ...
- Atitit.Base64编码原理与实现设计
Atitit.Base64编码原理与实现设计 1. Base64编码1 1.1. 为什么要用自己的base64编码方案1 2. Base64编码由来1 3. Base64编码原理1 3.1. 具体来说 ...
随机推荐
- javaScriptObject转String
function obj2str(o){ var r = []; if(typeof o =="string") return "\""+o.repl ...
- openerp 7.0 来自外部的邮件会发送二次问题解决方法
插入代码:\addons\mail\mail_mail.py #309 line this = self.pool.get('res.users').browse(cr, uid, uid, cont ...
- C#:设置焦点在最小的TabIndex控件上
private void FocusFirstTabIndex(Control container) { // init search result varialble Control searchR ...
- VC++程序员如何做好界面
本屌丝在新春放假期间闲来无事,在各大编程论坛溜达了一圈.发现年前的帖子中,有VC++程序员在界面开发方面遇到了很多苦恼,有抱怨界面工作不好做的,有抱怨用错了界面库的,也有紧急求得技术问题帮助的.看到这 ...
- openGL 坐标系的互相转换
openGL坐标系包括旋转,平移,缩放被塞在一个矩阵里面. 坐标系之间的转换基础是矩阵的运算. 每个矩阵代表的坐标系,就是是原点坐标系通过旋转.平移,缩放得到的坐标系. 当一个矩阵右乘一个向量或是还有 ...
- POJ 3691 DNA Sequence (AC自动机 + 矩阵 有bug,待修改)
DNA Sequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9889 Accepted: 3712 Desc ...
- Linux内核中锁机制之RCU、大内核锁
在上篇博文中笔者分析了关于完成量和互斥量的使用以及一些经典的问题,下面笔者将在本篇博文中重点分析有关RCU机制的相关内容以及介绍目前已被淘汰出内核的大内核锁(BKL).文章的最后对<大话Linu ...
- 编码规范:Eclipse Code Templates设置
现在的项目一般都是一个团队共同开发,而每个人都有自己的编码习惯,为了统一格式,项目组在项目开发之前都会制定一系列的规范.设置Code Templates的目的主要是为了统一各种注释的格式以及代码的模板 ...
- MongoDB查询指定字段(field)返回指定字段的方法
使用MongoDB的时候需要只查询指定的字段进行返回,也就是类似mysql里面的 SELECT id,name,age 这样而不是SELECT *.在MongoDB里面映射(projection)声明 ...
- vmware esxi 过期,激活
首先我们打开vSphere Client,登录esxi主机 他会提示你,说你的esxi主机的评估期还剩多长时间 我们现在去激活,我们下载esxi的注册机 然后点击配置--->已获许可的功能--- ...