字符编码概聊
关于编码:
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)+" "); } } }