字符编码概聊

字符编码概谈

关于编码:

1为什么有编码?

在显示器上看见的文字、图片等信息在电脑里面其实并不是我们看见的样子,即使你知道所有信息都存储在硬盘里,把它拆开也看不见里面有任何东西,只有些盘片。假设,你用显微镜把盘片放大,会看见盘片表面凹凸不平,凸起的地方被磁化,凹的地方是没有被磁化;凸起的地方代表数字1,凹的地方代表数字0。硬盘只能用0和1来表示所有文字、图片等信息。

 

因为计算机本质是计数以及实现数的数学逻辑运算。要想使其能输出和保存人类语言符号,就需要将语言文字符号进行编码,以保存和显示。这样计算机中的这样的一个数就有了两层含义:数值和符号码。

2各种编码关系

最早的符号码是asc码,它用0-127的数(1个byte)表示不同字符。这种西方编码没有考虑中国和其他国家的语言文字,因此各国出于需要,纷纷在asc的基础上,对其进行扩展,开发自己的编码方式。gbk可以看是一种适用与中文的编码方式。但由于各个标准的不一致,导致常出现乱码。

后来,国际发布unicode编码方式,统一所有的字符都由两个byte表示,并且其他所有的字符都统统收录其中,以实现统一。

 

如字母 a 的不同标准编码如下:

asc: 0x61

Gbk:       0x61

Unicode: ox 00 61

utf-8:0x61

汉字“我”:

asc:无

gbk: 0x ce d2

Unicode : 0x62 11.

utf-8:0xe6 88 91

 

3.Utf-8.unicode 和utf-16

 由于unicode编码方式和asc码不能兼容,因此为了使得一些旧软件仍能使用,故采用utf-8的方式对unicode编码进行修改,向asc码兼容,具体做法是采用变长编码。而常说的unicode就是utf-16be(大字节序)。

 

Java中采用unicode编码(utf-16be),并且可以通过String.getBytes(“XXX”)函数得到该String的XXX编码的byte数组。可以比较不同的编码方式的数值的不同。 

参考代码:

 

 

 

import java.io.UnsupportedEncodingException;
 
public class CharSet {
    String s = "a";
   
    public static void main(String[] args) throws UnsupportedEncodingException{
         CharSet test = new CharSet();
         test.bytesprint();
         test.getByte();
    }
   
    public void bytesprint(){
       for(int i=0 ;i <s.length();i++){
           char c = s.charAt(i);
           int high = c>>>8 & 0xff;
           int low = c & 0xff;
           System.out.print(Integer.toHexString(high)+" "+ Integer.toHexString(low)+" ");
       }
       System.out.println();
    }
public void getByte() throws UnsupportedEncodingException{
    byte[] bytes = s.getBytes("utf-8");
    for(int i=0;i<bytes.length; i++){
       int c = bytes[i] & 0xff;
           System.out.print(Integer.toHexString(c)+" ");
    }
}
}