`
东京日和
  • 浏览: 11841 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

Java中的编解码

 
阅读更多
在使用java的时候会涉及到编解码的内容。
首先,我们需要了解三个概念:
1. java文件和java class文件的编码格式是utf-8。
2. java class 文件在jvm中运行的时候需要转码成utf-16的编码格式。
3. java中的字符串在内存中的编码格式是unicode。
我们先看在内存中的java对象的编码格式是怎么转化的

我们可以看到String str = “杭州”,在真实的内存中存储的是字节流:(e6 9d ad e5 b7 9e);是由utf-8的编码格式编码的。
现在我们要看看“杭州”两字在gbk中的编码格式中的字节是什么:ba bc d6 dd;具体的代码如下:
        String str = "杭州";
        int k = 0;
        char[] res = new char[str.getBytes("gbk").length * 2];
        for(byte bb : str.getBytes("gbk")){
            res[k++] = hexDigits[bb >>> 4 & 0xf];
            res[k++] = hexDigits[bb & 0xf]; 
        }
        String s = new String(res); 
        System.out.println(s);

具体的示意图如下:

然后我们再把GBK的bytes流再转化成unicode编码的String对象:
String utfStr = new String(str.getBytes("gbk"),"gbk");


接下来讲JAVA网络中的编码格式。
浏览器和服务器中的传输方式基本上有两种:
1.放在http request的head:head中包括了URL信息,下面的图显示了URL的结构(网图,转自IBMDEVELOPER)


然后再具体看浏览器中的网络监视发送的reqeust,city的发送内容是“杭州”如下图


我们可以清楚的看到url中是根据UTF-8编码的。
具体的整个流程如下:



服务器端收到了一串bytes流,包括url,但是却不知道该用什么编码格式来对这段bytes流进行解码。
因为URI部分(浏览器发送网页的编码格式)和QueryString部分(根据网页的编码格式)的编码格式有可能不同,所以服务器接收的时候就会用不同的编码格式进行解码
URL 的 URI 部分进行解码的字符集是在 connector 的 <Connector URIEncoding=”UTF-8”/> 中定义的,如果没有定义,那么将以默认编码 ISO-8859-1 解析。
QueryString 的编码采取不同的编码格式不同可以猜测到解码字符集肯定也不会是一致的。的确是这样 QueryString 的解码字符集要么是 Header 中 ContentType 中定义的 Charset 要么就是默认的 ISO-8859-1,要使用 ContentType 中定义的编码就要设置 connector 的 <Connector URIEncoding=”UTF-8” useBodyEncodingForURI=”true”/> 中的 useBodyEncodingForURI 设置为 true。
上面两项的设置需要在tomcat的server.xml配置文件中设置。
如果不进行额外的设置读取正确request中的参数值的时候需要如下代码:
String city = new String(request.getParameter("city").getBytes("ISO8859-1"),"UTF-8");

这样city的值为“杭州”,具体过程如下:




2. 放在http request的body
主要形式是form表单post提交的信息。
POST 表单参数传递方式与 QueryString 不同,它是通过 HTTP 的 BODY 传递到服务端的。当我们在页面上点击 submit 按钮时浏览器首先将根据 ContentType 的 Charset 编码格式对表单填的参数进行编码然后提交到服务器端,在服务器端同样也是用 ContentType 中字符集进行解码。不需要进行额外设置。
  • 大小: 9 KB
  • 大小: 8.9 KB
  • 大小: 10 KB
  • 大小: 38.3 KB
  • 大小: 24.5 KB
  • 大小: 13.4 KB
分享到:
评论
2 楼 wuhao7171 2013-06-03  
markingt
1 楼 igoogll 2013-04-16  
uri 和url的定义貌似有出入,http://en.wikipedia.org/wiki/Uniform_Resource_Identifier 看这里

相关推荐

Global site tag (gtag.js) - Google Analytics