字符编码
ASCII,IOS-8859-1,GB2312,GBK,Unicode
1.为何需要编码?
所有的信息最终都表示为一个二进制的字符串,每一个二进制位(bit)有0和1两种状态。当我们需要把字符'A'存入计算机时,存储时,我们可以将字符'A'用01000010(这个随便编的)二进制字符串表示,存入计算机;读取时,再将01000010还原成字符'A'。那么问题来了,存储时,字符'A'应该对应哪一串二进制数呢,是01000010?或者是10000000 11110101?说白了,就是需要一个规则。这个规则可以将字符映射到唯一一种状态(二进制字符串),这就是编码。而最早出现的编码规则就是ASCII编码,在ASCII编码规则中,字符'A'既不对应01000010,也不对应1000 0000 11110101,而是对应01000001。
2.ASCII
这套编码规则是由美国定制,一共规定了128个字符的编码,比如空格"SPACE"是32(十进制)(二进制00100000),大写的字母A是65(二进制01000001)。这128个符号(包括 32个不能打印出来的控制符号),只占用了一个字节(8 bit)的后面7位,最前面的1位统一规定为0。总共才有128个字符编码,一个字节都没有用完,这好像似乎有点太少了。于是乎,就开始压榨最高位,对其为1时也进行编码,利用最高位进行编码的方式就称为非ASCII编码,如ISO-8859-1编码。
1byte=8bit
1k=1024byte
1M=1024k
1G=1024M
3. ISO-8859-1
ISO-8859-1编码也是单字节编码,最多能够表示256个字符。
4.GB2312
GB2312是双字节编码,其中高字节表示区,低字节表示位。
5.BIG5
BIG5采用双字节编码,使用两个字节来表示一个字符。
6.GBK
GBK编码依然采用双字节编码方案
7.Unicode
Unicode将码空间划分为17个平面,从00 - 10(十六进制,最高两位),即从0 - 16(十进制),每个平面有65536个码点(2^16),其中最重要的是第一个Unicode平面(码位从0000 - FFFF),包含了最常用的字符,该平面被称为基本多语言平面(Basic Multilingual Plane),缩写为BMP,其他平面称为辅助平面(Supplementary Planes),在基本多文种平面內, 从D800到DFFF之间的码位区段是永久保留不映射到字符的, 因此UTF-16编码巧妙的利用了这保留下来的码位来对辅助平面内的字符进行编码
8.UCS
UCS全称为"Universal Character Set",在UCS中主要有UCS-2和UCS-4。
⑴UCS-2
UCS-2是定长字节的,固定使用2个字节进行编码,从0000(十六进制)- FFFF(十六进制)的码位范围,对应第一个Unicode平面。采用BOM(Byte Order Mark)机制,该机制作用如下:1. 确定字节流采用的是大端序还是小端序。2. 确定字节流的Unicode编码方案。
⑵UCS-4
UCS-4是定长字节的,固定使用4个字节进行编码。也采用了BOM机制。
9.UTF
UTF全称为"Unicode Transformation Format",在UTF中主要有UTF-8,UTF-16和UTF-32。
⑴UTF-8
UTF-8是一种变长编码方式,使用1-4个字节进行编码。UTF-8完全兼容ASCII,对于ASCII中的字符,UTF-8采用的编码值跟ASCII完全一致。UTF-8是Unicode一种具体的编码实现。UTF-8是在互联网上使用最广的一种Unicode的编码规则,因为这种编码有利于节约网络流量(因为变长编码,而非统一长度编码)。关于Unicode码点如何转化为UTF-8编码,可以参照如下规则:
①对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
②对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。
⑵UTF-16
UTF-8是不定长的编码,使用1、2、3、4个字节编码,而UTF-16则只使用2或4个字节编码。UTF-16也是Unicode一种具体的编码实现。关于Unicode如何转化为UTf-16编码规则如下:
① 若Unicode码点在第一平面(BPM)中,则使用2个字节进行编码。
② 若Unicode码点在其他平面(辅助平面),则使用4个字节进行编码。
10.内存地址
⑴内存地址是一种用于软件及硬件等不同层级中的数据概念,用来访问电脑主存中的数据。
11.Java对象
1.Java对象大小计算
•在32位系统中,存放Class的指针空间大小为4字节,MarkWork为4字节,即对象头为8字节
•在64位系统中,存放Class的指针空间大小为8字节,MarkWork为8字节,即对象头为8字节
•64位系统下,如果开启了指针压缩,存放Class的指针空间大小为4字节,MarkWork为8字节,即对象头为12字节
•对于对象数据结构,参照上述三个规则,额外加上一个数组长度所含有的4个字节,就是最终对象头的大小
•计算对象的大小时,静态数据是不会被考虑进去的