编码问题:

在介绍编码问题前,先介绍一下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的编码原理的更多相关文章

  1. JSP/Servlet的编码原理

    转自:http://janwer.iteye.com/blog/150226 首先,说说 JSP/Servlet 中的几个编码的作用 在 JSP/Servlet 中主要有以下几种设置编码的方式: pa ...

  2. servlet请求编码与响应编码问题(编码不一致可能会导致乱码)

    html中的编码 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&g ...

  3. BASE64编码原理分析脚本实现及逆向案例

    在互联网中的每一刻,你可能都在享受着Base64带来的便捷,但对于Base64的基础原理你又了解多少?今天小编带大家了解一下Base64编码原理分析脚本实现及逆向案例的相关内容.   01编码由来 数 ...

  4. 一篇文章彻底弄懂Base64编码原理

    在互联网中的每一刻,你可能都在享受着Base64带来的便捷,但对于Base64的基础原理又了解多少?今天这篇博文带领大家了解一下Base64的底层实现. Base64的由来 目前Base64已经成为网 ...

  5. Base64图片编码原理,base64图片工具介绍,图片在线转换Base64

    Base64图片编码原理,base64图片工具介绍,图片在线转换Base64 DataURI 允许在HTML文档中嵌入小文件,可以使用 img 标签或 CSS 嵌入转换后的 Base64 编码,减少  ...

  6. Spark MLlib特征处理:OneHotEncoder OneHot编码 ---原理及实战

    http://m.blog.csdn.net/wangpei1949/article/details/53140372 Spark MLlib特征处理:OneHotEncoder OneHot编码 - ...

  7. 无线通信中FEC 编码原理及评价

    转自:http://blog.csdn.net/wiznet2012/article/details/7492146 大家好,前面我们给大家介绍了无线通信中FEC编码原理(1)和(2),今天继续献上F ...

  8. 4B/5B编码原理

    4B/5B编码原理 什么是4B/5B编码? 4B/5B编码是百兆以太网(即快速以太网)中线路层编码类型之一,就是用5bit的二进制数来表示4bit二进制数,映射方式如下表所示: 为什么要进行4B/5B ...

  9. Atitit.Base64编码原理与实现设计

    Atitit.Base64编码原理与实现设计 1. Base64编码1 1.1. 为什么要用自己的base64编码方案1 2. Base64编码由来1 3. Base64编码原理1 3.1. 具体来说 ...

随机推荐

  1. Windows 10 Pro_Ent Insider Preview x86 x64 10147中文版激活

    点击激活windows输入密钥:CC6JP-VN67C-8KCJ4-4V48V-HXM9B然后下载附件中的程序解压后运行注销即可激活企业版:在专业版基础上输入升级密钥:CKFK9-QNGF2-D34F ...

  2. Android中保存静态秘钥实践(转)

    本文我们将讲解一个Android产品研发中可能会碰到的一个问题:如何在App中保存静态秘钥以及保证其安全性.许多的移动app需要在app端保存一些静态字符串常量,其可能是静态秘钥.第三方appId等. ...

  3. js 获取地址栏的值乱码问题

    传过去的参数是:(01) 0 6936841 40029 4. 接收的参数的:'(01)%200%206936841%2040029%204'. 因为包含空格,或者中文,就会乱码.要想不乱码,接收的使 ...

  4. loadrunner中log的使用初步总结

    1.log的设置方式 . 在 runtime setting中可以设置log的生成方式: 默认的log方式: Enable logging选中,log option是Send messages onl ...

  5. try语句...

    #include<stdio.h>#include<iostream>using namespace std; int main( ){ try { throw "嗨 ...

  6. Python学习笔记015——汉字编码

    1 字符串的编码(encode)格式 GB2312   GBK   GB18030  UTF-8  ASCII 其中常用的编码格式有 国标系列:GB18030(GBK(GB2312)) (window ...

  7. PLSQL_SQL Loader的概念和用法(概念)

    2014-06-08 Created By BaoXinjian

  8. Android笔记(十)ListView

    ListView是Android中最经常使用的控件之中的一个,也是最难用的控件. ListView的作用是展示大量的数据,只是ListView并非直接和数据打交道.而是通过适配器作为中间桥梁. 1.首 ...

  9. C# 动态获取代码所在行号

    通过System.Diagnostics.StackTrace获取代码所在行号和文件信息 获取行号信息 /// <summary> /// Get line number of code ...

  10. Matlab图形调色

    Matlab图形调色 Simple example var colormap = require('colormap') options = {   colormap: 'jet',   // pic ...