计算机基础知识

编译器相关知识介绍

编译器

  将高级语言代码转换成CPU能识别的二进制指令,也就是将代码加工成.exe程序,这个工具叫做编译器(Complier)。

  

链接器

  编译器一次只能编译一个源文件,如果程序包含了多个源文件,就需要编译多次。编译器每次编译的结果是产生一个中间文件,而不是最终的可执行文件。将当前程序的所有中间文件以及系统库组合在一起,才能形成最终的可执行文件,这个组合过程叫做链接。完成链接功能的软件叫做链接器。链接后生成可.exe执行文件。

计算机编码

计算机只能存储0和1这些二进制数字,而其文本里的字母,数字,汉字等一系列符号都需要经过某一种方式转换成二进制数字进行储存,需要用的时候再读出来。

二进制、十进制、十六进制

  二进制是0和1,十进制是0-9,十六进制0-9和a-f。

ASCII

  1963年,ANSI推出了ASCII(美国信息交换标准代码)。
  标准ASCII码使用7位二进制数(0-127)来表示所有的大小写字母,数字,标点以及美式英语中使用的特殊的控制字符。后来又有了拓展ASCII,用8位二进制数来表示(0-255)。
  再后来,各个国家在ASCII的基础上推出了本国语言的编码表,既兼容 ASCII 又互相之间不兼容的字符编码,后来又统称为 ANSI 编码

Unicode

  Unicode又叫万国码,包括字符集,编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码。
  在 Unicode 编码方案里常见的有四种编码实现方案:UTF-7、 UTF-8、UTF-16、UTF-32。这里面UTF-8最为常见。
  字符集只是字符及字符对应码点的集合,不代表字符一定会以对应码点被存储在计算机中。字符编码才是真正定义从字符到计算机储存内容的映射。

UTF-32

  UTF-32直接就把字符对应的码点以其二进制储存在计算机里。UTF-32规定每个字符都以32比特即4字节的长度来储存,位数不够在前面补0。ASCII里的每个字符所占的空间大小是一字节,GBK里一个汉字占用两个字节,如果把他们用UTF-32来实现,空间效率很差,因此而生出了UTF-8。

UTF-8

  UTF-8是Unicode的实现方式之一。UTF-8 最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
  对于单字节的符号,字节的第一位设为0,后面7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的。
  对于n字节的符号(n > 1),第一个字节的前n位都设为1,第n + 1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。

GB国标编码系列

  我们国家的有关部门按照ISO规范设计了GB2312双字节编码。但是它能收录的字符有限。后来有了GBK、GB18030。
  在GB系列编码方案下,一段文本中,如果一个字节是0-127,那么这个字节的含义与ASCII编码相同,否则,这个字节就和下一个字节共同组成汉字或其他字符。GB系列是兼容ASCII的。

GB2312

  GB2312 是使用两个字节来表示汉字的编码标准,共收入汉字 6763 个和非汉字图形字符 682个。
  GB2312 属于变长编码,当是英文字符的时候占一个字节,中文字符的时候占两个字节,可以认为 GB2312 是对 ASCII 的中文扩展。

GBK

  GBK 即国标扩展的意思。
  GBK码的2个字节,第一个字节的范围是0x810xfe,第二个字节的范围是0x400xfe,GBK协议有规定,第二个字节的0x7F位置是空着的,没有字节。所以一共有126*190=23940个字符。

GB18030编码

  GB18030是中华人民共和国现时最新的内码字集。与 GB2312-1980 完全兼容,与 GBK 基本兼容,支持 GB13000 及 Unicode 的全部统一汉字,共收录汉字 70244 个。与 UTF-8 相同,采用多字节编码,每个字可以由1个、2个或4个字节组成。
  GB18030 其实是对齐 Unicode 标准的,里面包括了所有 Unicode 字符集,也算是 Unicode 的一种实现(UTF)。

使用Java程序进行编码解码

在String中提供了一些方法
编码

1
2
byte[] getBytes()  //使用平台默认字符集将该String编码为一些列字节,将结果存储到新的字节数组中
byte[] getBytes(String charsetName) //使用指定字符集将该String编码为一系列字节,将结果存储到新字节数组中

解码

1
2
String(byte[] bytes)  //通过平台的默认字符集编码指定的字节数组来构造新的String
String(byte[] bytes , String charsetName) //通过指定的字符集解码指定的字节数组来构造新的String
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class Test {
public static void main(String[] args) throws UnsupportedEncodingException {
//1.编码
String data = "a我b" ;
byte[] bytes1 = data.getBytes(); //默认按照(UTF-8)编码
System.out.println(Arrays.toString(bytes1));

byte[] bytes2 = data.getBytes("GBK");
System.out.println(Arrays.toString(bytes2));

String s1 = new String(bytes1);
String s2 = new String(bytes2);
String s3 = new String(bytes2,"GBK");

System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
}
}

>>>
[97, -26, -120, -111, 98]
[97, -50, -46, 98]
a我b
a��b
a我b