关于计算机编码的研究

说到编码,学计算机的肯定都知道ASCII,这是一套编码规则,即用7bit来表示128个字符(符号),可以认为就是我们键盘上的那些符号们,他的官方名称叫做:美国信息交换标准代码,是美国的!

他同时也可以认为是一套码值表,即比如x110 0001表示字符‘a’,

但是,英文没问题,日文,韩文,还有我们博大精深的中文咋办,于是就诞生了更多的编码规则

一,Unicode

这是一套码值表,他收集了世界上所有的符号系统,所有的,包括音节,神秘的符号等,只要给我一个字符,我一查表,就知道他对应的码点是多少?

但是那总不能就直接这么去查把,他总有一套规则规范哪些码点对应哪些字符,于是对应的编码方式有:UTF-16/UTF-32.....

具体怎么做的呢,或者说编码规则是什么呢?

1,概念简介

字符/符号/码点:'a','1‘......是字符/符号/码点;随便一个画一下就是符号/码点;用计算机的1010去编码一个符号,那么这一组01数字就是一个码点

Unicode/UTF-32/UCS-4...:Unicode是码值表,UTF-32等是编码规则,表示以怎样的规则生成码-值的对应关系

2,编码规则

为每一个符号分配一个码点,即一个rune类型的变量

1)UTF-8

这个规则是说,用一个变长的0101序列去作为一个码点来代表一个字符,即用1-4Byte来表示一个Unicode码点,具体说来如下

(1)对于属于原来的ASCII字符集的字符,还是用1个字节

(2)一些常用的字符用2或3字节表示,

(3)其他

那到底这个字符是由几个字节组成的呢?答:预留第一个字节的高位bit作为prefix,如:

0xxxxxxx:0-127,如果首字符是0,说明接下来的1个字节代码1个码点,这个码点表示的正是ASCII字符

110xxxxx 10xxxxxx:128-2047,如果首字符是110,说明接下来2个字节的代表1个码点

1110xxxx 10xxxxxx 10xxxxxx:2048-65535,如果首字符是1110,说明接下来3个字节的代表1个码点

11110xxxx 10xxxxxx 10xxxxxx 10xxxxxx:65536-,如果首字符是11110,说明接下来4个字节的代表1个码点

3,这种编码方式的好处

紧凑,不占用多余的存储空间,并且兼容ASCII字符集;

属于前缀编码,如果是从左向右解码,则肯定不会有歧义

如果是从右向左解码,多回溯两个字节就可以确定当前字符编码开始的位置(因为最多4个字节,就算处在第四个字节向前回溯2个字节还没到prefix那就知道了,我是四字节的,再往前就是头了)

4,应用场景

GO语言的源文件就是采用UTF-8编码,并且GO语言库函数对处理UTF-8编码的文本也很出色。

unicode包提供了诸多处理rune字符相关的功能函数,其中unicode/utf8包则提供了用于处理rune字符序列的的UTF8编码和解码功能

--《GO语言圣经》中说的

水鬼子:不知道你是否有这样的疑惑,“Go语言的源文件采用UTF8编码"是什么意思?这里就要稍微说一下编译原理

                Go语言或者其他语言编写的源代码,机器是不认识的,他一定要变成010101才能执行,于是有了我们常见的预编译,编译,汇编,链接等概念,详见xxxxxx

                所以,从源代码中if else balala之类的语句转化成二进制010101,就是按照utf-8这个规则进行转化的

2)UTF-16

.....

3)UTF-32

....

------------------未完,待续--------------------------------- 

猜你喜欢

转载自www.cnblogs.com/shuiguizi/p/11372985.html