读书人

字符编码概聊

发布时间: 2013-08-09 15:16:24 作者: rapoo

字符编码概谈

关于编码:

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)+" ");    }}}  

?

读书人网 >操作系统

热点推荐