编码相关总结
一:基础
字符集:字符的集合,如ASCII是英文字符集,Unicode是最全的字符集, GB2312 是汉字字符集。 编码方式:字符集的字节表示方式,定义了一个字符用几个字节,用那些字节(码点)表示这个字符。 关系:一个字符集至少有一种编码方式,如Unicode有utf-8和utf-16等编码方式。
术语:编码
动词编码:将字符用码点表示,一般是指设计字符集的编码方式的过程,即字符->字节。 名词编码:码点,或字节序列。 编程语言中的编码:一般指将数据由一种形式或格式转为另一种形式的过程。 有些文章说编码是字符->字节,解码是字节->字符。个人认为是不准确的。字符之所以能显示,是因为其底层是字节序列,且有默认的编码方式,如Go语言默认是utf-8。所以凡是能看到的字符底层是unicode码点,本身就编码过不需要再编码了。什么时候需要编码呢?字节序列在Go中默认是utf-8编码,但是预期是通过hex或base64字符串显示呢?所以要对字节序列进行hex编码或base64编码,编码后还是字节序列,但是要显示为字符串还是通过utf-8编码显示。 所以这样看来,编码更像是源字节->目标编码方式的字节再显示成字符的过程。 总结:编码还是解码都是字节->字节,字符底层表示是字节,字符显示不是编程语言的事也与编码无关。
编码转换:一种码点->另一种码点,通过算法和查询两种字符集之间的码点映射来实现。
xml,json字符串和[]byte
//string底层数据是字节数组,是utf-8的码点字节
//[]byte字节切片,所有数据最底层都是二进制数据,[]byte是给编程提升可读性的,而不是直接操作二进制。
//json字符串,jsonStr是string类型,底层是utf-8编码的字节数组,如果需要进行传输将其强转为[]byte即可。xml字符串同理。
jsonStr := `{"a":1}`
jsonData := []byte(jsonStr) //字节切片,可用于传输
//原本有一个utf-8编码json格式的字节数据,想要显示
jsonData := []byte{...}
jsonStr := string(jsonData)
//struct<->xml或json
//结构体相对是复杂的数据结构,不适合传输,所以要将其序列化为字节序列。用xml或json格式存储。
序列化(Marshal):结构体等复杂类型->json等字符串(底层是utf-8字节序列)
反序列化(Unmarshal):json等字符串(底层是utf-8字节序列)->结构体等复杂类型
BIN码-是最底层的编码
二进制码,可以表示数字、字符、图像等。计算机中所有数据最终都一二进制码的方式存储、传输和处理。
和utf-8等编码的关系,utf-8只是用一个码点对应一个字符,码点的底层表示是二进制码,只是我们处理时使用字节。
BCD码
BCD(Binary-Coded Decimal)码是一种将十进制数字的每一位分别用四位二进制表示的编码方式。
如:整数10的BCD码表示0001 0000
作用:使用BCD码存储浮点数不会丢失精度,相比二进制码也更节省空间。
HEX编码
将十进制整数转为两位十六进制字符(ASCII编码存储)
如 整数10,十六进制为0a,经过hex编码后底层字节为[48 97],48对应字符0,97对应字符a。
作用:提升数据可读性
base64编码
将二进制数据编码为字符的一种编码方式,有些只能传输ASCII字符的协议或者有些二进制有特别作用(如果用二进制就有歧义),不适合直接使用二进制编码,就可以用base64编码进行传输,到时候再解码。
标签:总结,编码,utf,字节,字符,码点,相关,编码方式 From: https://www.cnblogs.com/longanWu/p/17770845.html