关于编码

今天在公司自己写的接口突然被人找到说接口调用失败!由于我负责的这个服务的接口有一个参数是要求JSONArray格式的,里面会有一些 [ { " 这些字符。所以他们说是是不是要编码,我这边要编码...我就一脸懵逼。我们用的是Resultful风格的Jersey框架的调用方式,这里面应该会有自己的编码和解码的统一格式啊。最后发现原来是通过我们接口返回的信息中,有一个组数据转json报错了。。。这个看异常消息完全能看出的啊!

所以为了不被人忽悠,我自己看了下《深入分析javaweb技术内幕》这本书里的关于java编码格式这一章,下面算是给自己做个总结吧:

为什么要编码?

我们为什么要编码?我们能不能不编码?
要回答这两个问题,我们就需要知道计算机是怎么表示的我们能够理解的符号,也就是我们人类使用的语言。
目前计算机中一个最小的存储单元是---字节(byte),也就是说8个bit,8位二进制的数。那我们就需要把这些字节能够“翻译”成我们理解的字符。那么这时“翻译”就是一个编码的过程。简单的来说就是要用计算机的01这种二进制里映射咱们能够理解的字符。
那人类需要表示的字符太多了,英文字母可能还少点,汉字,阿拉伯,俄文还有一些特殊字符等等。然而一个字节只能代表256个字符。所以为了解决这个矛盾必须要有一个新的数据结构:char,char到byte必须编码。

一些常见的编码格式:

  1. ASCII码 **
    ASCII总共有128个,用一个字节的低7位表示,最高位用来做奇偶校验。031来表示控制字符,如换行、回车、删除等,32126是打印字符,都是键盘输入或者能够显示出来的。
    2.
    ISO-8859-1**
    这个是ISO组织在ASCII码的基础上又订的一个标准。ISO-8859-1涵盖了大多西欧语言字符,应用的较为广泛。但这个仍是单字节编码,所以说总共能标示256个字符。
  2. GB2312
    全称叫《信息技术中文编码字符集》,顾名思义,这套编码是包含汉字的,而且是双字节。他从B0~F7是汉字区,包含了6763个汉字。
  3. GBK
    这个是大家较为常见的编码格式了,全称《汉字内码扩展规范》,是国家技术监督局为Windows95所指定的新的汉字内码规范,这个就是扩展了GB2312,并加入了更多的汉字,编码范围是8140~FEFE,总共23840个码位,它能标示21003个汉字,它的编码是兼容GB2312的。
  4. UTF-16
    UTF-16采用了Unicode编码,采用定长的表示方法,即不论什么字符都可以用两个字节表示。这大大的简化了字符串的操作,这也就是为什么java用UTF-16作为内存的字符存储格式的一个重要原因。
  5. UTF-8
    虽然UTF-16统一采用两个字节来表示一个字符,虽然很简单方便,但是也有其缺点,那就是不论什么都要用两个字节表示,有些字符用一个字节就可以表示却必须还要用两个字节来表示,这样存储空间就会有浪费。然而UTF-8采用了一种变长技术,即会先分一些编码区,让每个编码去有不同的字码长度。不同类型的字符可以由1~6个字符组成
    具体规则如下:
  • 如果是一个字节,最高位为0,则表示说这是一个ASCII字符
  • 如果是一个字节以11开头,则连续1的个数则按时了这个字符的字节数。例如:110*****代表它是双字节UTF-8的首字节。
  • 如果是一个字节以10开始,表示他不是首字节,则需要向前查找才能得到当前字符的首字节。

今天就先总结这么多,接下来会总结在java编程里需要知道的一些编码的知识。

你可能感兴趣的:(关于编码)