`
东京日和
  • 浏览: 11965 次
  • 性别: 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 看这里

相关推荐

    视频/音频编解码器的纯 Java 实现

    JCodec 是一个实现一组流行的视频和音频编解码器的库。目前 JCodec 支持 MP4 视频格式。JCodec 是在 FreeBSD 许可证下分发的自由软件。支持的功能:从视频文件中解码特定的图像帧。性能/质量注意事项 由于 JCodec 是...

    GSM-PDU模式短信编解码-java代码

    项目中用到了AT指令中的GSM短信息的收发,上网找的代码大多都是C或者C++语言编写的,因为我使用的是java语言,于是决定自己编写一套java语言的GSM-PDU模式短信息编码与解码的代码: 1、短信传输分三种模式:Block...

    java G711 编解码(基于JNI)

    基于JNI的G711编解码 支持alaw -&gt; pcm / pcm -&gt; alaw / ulaw -&gt;pcm / pcm -&gt; ulaw / alaw -&gt; ulaw / ulaw -&gt; alaw 目前只支持windows 内含有 可直接使用jar包 、java源码、C/C++源码 纯java编写G711、仅支持alaw与...

    java g711编解码程序

    Java G711编解码程序是用于处理音频数据,特别是电话通信中广泛使用的线性脉冲编码调制(Pulse Code Modulation, PCM)的编码格式。G.711标准是由国际电报电话咨询委员会(ITU-T)制定的,它定义了两种主要的编码...

    java的base64编解码

    base64编解码

    mina自定义编解码器详解

    在mina框架中,编解码器(Codec)扮演着至关重要的角色,它负责将应用层的数据转换为网络传输的字节流,以及将接收到的字节流还原为应用程序可以理解的对象。对于初学者来说,理解和编写自定义的编解码器可能会遇到...

    编解码器JAVA

    在压缩包`coder-and-decoder-JAVA-master`中,可能包含了一个关于Java编解码的示例项目或库,它可能涵盖了上述的一些或全部知识点。这个项目可能提供了实用的工具类,帮助开发者更方便地进行数据的编码和解码操作。...

    Java Gif 编码和解码程序

    Java GIF编码和解码是计算机图形处理中的一个重要领域,特别是在网页和应用程序中处理动画和静态图像时。GIF(Graphics Interchange Format)是一种流行的位图格式,支持透明度和有限的动画功能。在Java中,处理GIF...

    java G711(JNI)

    通过JNI,开发者可以在Java应用程序中调用C/C++编写的高效函数,以提高性能或实现Java本身不支持的功能,如本例中的音频编解码。 3. 实现步骤 - 创建C/C++头文件:定义Java类中的native方法签名,这些方法将在C/C++...

    Windos音频编解码

    在IT领域,音频编解码是一项核心技术,尤其在多媒体处理、通信系统以及各种软件应用中不可或缺。本项目“Windos音频编解码”专注于Windows平台的音频编码与解码功能,提供了一套易于使用且可定制化的解决方案。下面...

    java G711 编解码

    G711 A 编解码 java版 可以直接使用

    ASN.1 UPER编解码工具 示例代码

    2. **注解支持**:用户可以通过在数据结构或源代码中添加特定注解,指示哪些部分应使用UPER进行编解码。这种方式降低了集成成本,提高了开发效率。 3. **灵活性**:由于描述中提到了“添加注解”,这意味着该工具...

    sbc子带压缩编解码算法C语言版本

    sbc子带压缩编解码算法是一种在蓝牙音频传输中广泛使用的高效编码技术。这个算法的主要目的是在保持音频质量的同时,减少数据传输量,以适应蓝牙这种低带宽无线通信系统的特性。本文将深入探讨sbc算法的原理、实现...

    java使用Hex编码解码实现Aes加密解密功能示例

    在本文示例中,我们关注的是如何利用Java的Hex编码和解码来处理AES加密和解密的过程。 首先,让我们了解什么是Hex编码。Hex编码是一种将二进制数据转换为可打印字符的表示方式,每个字节被转换为两个十六进制数字...

    Netty中Marshalling编解码自定义栈应用

    在 Netty 中,编解码器是处理数据传输的关键组件,它们负责将原始字节流转换为有意义的对象,反之亦然。本文将深入探讨 Marshalling 编解码器在 Netty 中的应用及其自定义实现。 Marshalling 是一种序列化技术,它...

    G722编解码源代码

    G722是一种广泛应用于语音通信的音频编解码标准,尤其在IP电话和网络音频传输中占有重要地位。这个压缩包包含的源代码文件,是实现G722编解码功能的关键部分,让我们来深入了解一下这些文件及其在G722编解码过程中的...

    音频编解码

    在本文中,我们将深入探讨音频编解码的基本原理、常见编码格式以及Java通过JNI调用C/C++实现音频编解码的方法。 首先,音频编解码的主要目的是为了压缩音频数据,使其占用更少的存储空间和传输带宽。常见的音频编码...

    PDU 短信编解码工具(升级版)

    PDU短信编解码工具是IT领域中一种实用的软件工具,主要针对的是通信协议中的短信服务(SMS)。PDU,全称为Protocol Data Unit,即协议数据单元,是GSM(全球系统移动通信)网络中短信传递的一种编码方式。这个升级版...

    基于java序列化的Netty编解码技术

    在Netty中,Java序列化常用于编解码,将Java对象转换为可传输的网络数据包,再从接收到的数据包中恢复对象。 Netty提供了一个`SerializationCodec`类,它是`ChannelInboundHandler`和`ChannelOutboundHandler`的...

    G722音频编解码

    G722音频编解码是一种广泛应用于网络通信中的音频编码技术,特别是在VoIP(Voice over Internet Protocol)和视频会议系统中。它基于ITU-T G.722标准,旨在提供高质量、全双工的音频传输,适用于64kbps的带宽。以下...

Global site tag (gtag.js) - Google Analytics