编码格式详解:多字节字符集和Unicode字符集

多字节字符集

多字节字符集 (MBCS)
通常指的是ANSI、中文编码以及Shift-jis,jis,euc-jp,euc-kr等。

Unicode字符集

Unicode字符集即平常说的宽字节,包含Utf-8、Utf-16、Utf-32。


常见编码方式及相关概念

1. ANSI

ANSI并不指某一特定的字符编码,应该说是一个字符编码簇。
包含GB2312、GBK、GB18030、Big5、Shift_JIS等各个国家和地区的字符编码。
它是根据计算机系统的语言设置来选择具体的编码方式。

在简体中文Windows操作系统中,ANSI 编码代表 GB2312 编码;
在繁体中文Windows操作系统中,ANSI 编码代表 Big5;
在日文Windows操作系统中,ANSI 编码代表 JIS 编码。
而韩文系统中 ANSI 编码其实是 EUC-KR 编码。


2. ASCII

ASCII码是大多数常用编码方式的基础,它是一个7位的编码标准,包括26个小写字母、26个大写字母、10个数字、32个符号、33个控制代码和一个空格,共128个代码。可以通过键盘输入并且能够显示出来。


3. GB2312

全称是GB2312-80《信息交换用汉字编码字符集 基本集》,1980年发布。
共收录6763个简体汉字、682个符号,其中汉字部分:一级字3755,以拼音排序,二级字3008,以偏旁排序。


4. GBK

全称叫《汉字内码扩展规范》,是国家技术监督局为 windows95 所制定的新的汉字内码规范,它的出现是为了扩展 GB2312,加入更多的汉字。
因此能够完全兼容GB2312,不会出现乱码。并涵盖了原Unicode中所有的汉字20902个。
它的编码范围是 8140~FEFE(去掉 XX7F)总共有 23940 个码位。其中883个符号, 21003个汉字。
GBK编码支持国际标准ISO/IEC10646-1和国家标准GB13000-1中的全部中日韩汉字,并包含了BIG5编码中的所有汉字。GBK编码方案于1995年12月15日正式发布,这一版的GBK规范为1.0版。


5. Unicode

Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方式等。它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。1990年开始研发,1994年正式公布。
具体的编码方式有Utf-8、Utf-16、Utf-32等。

字符对应的Unicode代码称为 码点


6. Utf -8

Utf 全称是 Unicode TransferFormat 。是Unicode中一种可变长度编码方式。由Ken Thompson于1992年创建。现在已经标准化为RFC 3629。UTF-8用1到6个字节编码Unicode字符。用在网页上可以统一页面显示中文简体繁体及其它语言(如英文,日文,韩文)。

编码规则如下:

  • 如果一个字节,最高位(第 8 位)为 0,表示这是一个 ASCII 字符(00 - 7F)。可见,所有 ASCII 编码已经是 UTF-8了。
  • 如果一个字节,以 11 开头,连续的 1 的个数暗示这个字符的字节数,例如:110xxxxx 代表它是双字节 UTF-8字符的首字节。
  • 如果一个字节,以 10 开始,表示它不是首字节,需要向前查找才能得到当前字符的首字节
Unicode码点范围bitsUTF-8
0x0000 - 0x007F7 bits0xxxxxxx
0x0080 - 0x07FF11 bits110xxxxx 10xxxxxx
0x0800 - 0xFFFF16 bits1110xxxx 10xxxxxx 10xxxxxx
0x01 0000 - 0x10 FFFF21bits11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

7. Utf -16

平面 : Unicode中的字符不是一次性定义的,而是分区定义。每个区可以存放 65536 个字符,称为一个平面(plane)。目前,一共有 17 个平面。

最前面的 65536 个字符位,称为基本平面(简称 BMP ),它的码点范围是从0x0000 到 0xFFFF。所有最常见的字符都放在这个平面,这是 Unicode 最先定义和公布的一个平面。

剩下的字符都放在辅助平面(简称 SMP ),码点范围从 0x010000 到 0x10FFFF。

基本平面的字符占用 2 个字节,辅助平面的字符占用 4 个字节。

编码方式如下:

Unicode码点范围UTF-16编码方式
基础平面0x0000 - 0xFFFF2 Byte存储,基础平面的字符 Utf-16 编码和它的 Unicode 码点相同
辅助平面0x01 0000 - 0x10 FFFF4 Byte存储,先将码点减去(0x10000),得到20bit长的值。 再将Unicode分为高10位和低10位。 高10位的值加上 0xD800,得到UTF-16编码的高位(或称为前导代理,存储高位); 低10位的值加上 0xDC00,得到UTF-16编码的低位(或称为后尾代理,存储低位)
   如汉字的 "𠮷",Unicode码点为 0x20BB7 
   减去 0x10000 后是 0x10BB7, 二进制为 0001 0000 1011 1011 0111
   高十位是 00 0100 0010, 为 0x42 , 加上 0xD800, 得到高位 0xD842
   低十位是 11 1011 0111, 为 0x3B7, 加上 0xDC00, 得到低位 0xDFB7
   因此 "𠮷" 字的 Utf-16 编码为 0xD842DFB7

8. Utf -32

定长(fixed-length)编码,能够表示所有Unicode码点,每个码点都是用4个byte表示,空间浪费很大,较少使用。





概念的东西没有完全理解的话很难记住,内容丰富,建议大家收藏后反复观看哦。

  • 6
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值