简述Unicode字符集、ASCII码与UTF-8编码的关系与区别


字符集与编码

字符集:考虑如何将字符映射成数字ID,不考虑传输和存储,只考虑每一个字符都对应唯一的数字
编码规则:考虑如何对目标进行编码,需要考虑传输和编码单位。

ASCII码

ASCII((American Standard Code for Information Interchange): 美国信息交换标准代码)码是最初美国国家标准,供不同计算机在相互通信时用作共同遵守的西文字符编码标准。由于他出现的早,所以即是字符映射规则,也是计算机使用字符时的传输和存储规则。所以即是字符集又是编码规则。规定8个二进制位为1字节。ASCII码长8位其中第一位为0所以其余7位可以表示2^7=128个字符

Unicode码

unicode码是由ISO组织提出,对世界上所有语言字符建立的编码,世界上每一个字符都对应唯一的一个固定长的8位十六进制编码(称为Code Point-码点)。所以是一个字符集。

UTF-8码

由于unicode码所有常用和罕见字符均采用定长编码,所以一些字符可能出现大量补0的情况。于是utf-8编码出现了,它以8位为一个编码单位/传输单位,采用1~4个字节的可变长的规则(英文1字节、中文3字节,utf-8通过编码数字指定了一个字符用多少字节,方便计算机使用)对字符进行编码。其中常用字符的编码更短,罕见字符的编码更长,已达到节省存储空间的目的。是一种对于计算机的编码规则。其对Unicode码点的编码方式为:

UTF-16码

另一种编码方式为UTF-16码,它将Unicode码点编码为1个或2个16位值,每一个16位称为一个代码单元。存在两种UTF-16编码方式:高位优先与低位优先。例如16进制值:0x2122,对于低位优先,存储顺序为0x21 0x22,高位优先存储顺序则是0x22 0x21。在一个文件中可以以字节标记顺序作为先导,指示UTF-16的存储规则,如高位优先是:0xFEFF。

在Java中一个char类型大小为两个字节,只能描述16位的值,即只可以表示一个UTF-16代码单元。因此面对一些特殊的辅助字符时,使用char来表示它可能会出错。

GBK/GB2312/GB18030

针对中文常用汉字(GB2312)、繁体字与字符(GBK)、多民族字符(GB18030)的字符进行的编码规则(向下兼容),适用于汉字。为什么有了UTF-8,GBK等规则还会频繁出现使用呢?因为它对于中文字符一般会更节省空间(中文2字符)。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM