C语言编码方式之ASCII、ANSI、Unicode

ASCII全称(American Standard Code for Information Interchange)美国信息交换标准代码,在计算机内部中8位二进制位组成1个字节(8(比特)bit=1(字节)byte),而ASCII的编码方式是把一个字节中的低7位用来编码,

最高位也就是第8位留着不用(最高位一般为0,但有时也被用作一些通讯系统的奇偶校验位),从0x00一直编码到0x7f(0000 0000 到 0111 1111),一共128个字符

2、ANSI

ANSI全称(American National Standard Institite)美国国家标准学会(美国的一个非营利组织),首先ANSI不是指的一种特定的编码,而是不同地区扩展编码方式的统称,各个国家和地区所独立制定的兼容ASCII

但互相不兼容的字符编码,微软统称为ANSI编码

C语言编码方式之ASCII、ANSI、Unicode

 (GBK是在国家标准GB2312基础上进行了扩容,包含的字符更多)

补充:在windows下输入命令行的黑框下,右键再点击属性可以看到当前的编码方式和代码页

C语言编码方式之ASCII、ANSI、Unicode

代码页也称为“内码表”,是与特定语言的字符集相对应的一张表。操作系统中不同的语言和区域设置可能使用不同的代码页(代码页一般与其所直接对应的字符集之间并非完全等同,往往因为种种原因

(比如标准跟不上现实实践的需要)而会对字符集有所扩展)

3、Unicode

Unicode 是一套字符集,而不是一套字符编码,严格来说,字符集字符编码不是一个概念:

1、字符集定义了字符和二进制的对应关系,为每个字符分配了唯一的编号。可以将字符集理解成一个很大的表格,它列出了所有字符和二进制的对应关系,计算机显示文字或者存储文字,就是一个查表的过程。

2、而字符编码规定了如何将字符的编号存储到计算机中,如果使用了类似 GB2312 和 GBK 的变长存储方案(不同的字符占用的字节数不一样),那么为了区分一个字符到底使用了几个字节,就不能将字符的编号

直接存储到计算机中,字符编号在存储之前必须要经过转换,在读取时还要再逆向转换一次,这套转换方案就叫做字符编码。

有的字符集在制定时就考虑到了编码的问题,是和编码结合在一起的,例如 ASCII、GB2312、GBK、BIG5 等,所以无论称作字符集还是字符编码都无所谓,也不好区分两者的概念。而有的字符集只管制定字符的编号,

至于怎么存储,那是字符编码的事情,Unicode 就是一个典型的例子,它只是定义了全球文字的唯一编号,我们还需要 UTF-8、UTF-16、UTF-32 这几种编码方案将 Unicode 存储到计算机中。

C语言编码方式之ASCII、ANSI、Unicode

 (有兴趣的读取可以转到 https://unicode-table.com/cn/ 查看 Unicode 包含的所有字符,以及各个国家的字符是如何分布的)

1、UTF-8

编码方式:

1、如果只有一个字节,那么最高的比特位为 0,这样可以兼容 ASCII;

2、如果有多个字节,那么第一个字节从最高位开始,连续有几个比特位的值为 1,就使用几个字节编码,剩下的字节均以 10 开头。

(对于常用的字符,它的 Unicode 编号范围是 0 ~ FFFF,用 1~3 个字节足以存储,只有及其罕见,或者只有少数地区使用的字符才需要 4~6个字节存储)

具体的表现形式为:

0xxxxxxx:单字节编码形式,这和 ASCII 编码完全一样,因此 UTF-8 是兼容 ASCII 的;

110xxxxx 10xxxxxx:双字节编码形式(第一个字节有两个连续的 1);

1110xxxx 10xxxxxx 10xxxxxx:三字节编码形式(第一个字节有三个连续的 1);

11110xxx 10xxxxxx 10xxxxxx 10xxxxxx:四字节编码形式(第一个字节有四个连续的 1)

下面是具体的 Unicode 编号范围与对应的 UTF-8 二进制格式 

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/5667ea60a89066f3bc34dc8175a9d2c3.html