一. golang中的字符类型
在golang一共存在3种字符类型: string []byte 和 []rune
1. 其中string最好理解,就是字面含义上的字符, 如
s := "字"
2. []rune代表的则是字符的unicode编码值, 如
r := []rune("字") fmt.Print(r)
我们会发现打印出的结果是 [23383], 这个就是汉字 “字” 的Unicode编码值的10进制表达
如果转换成16进制的结果是5B57, 就是我们常见的
hex := "\u5B57" fmt.Print(hex) //输出“字”
3.[]byte代表的是按照utf-8格式对字符的unicode值进行编码后的结果
s := "字" fmt.Println([]byte(s))
输出的结果[229 173 151], 我们将这个结果转化成 2进制则是 ①[11100101, 10101101, 10010111]
我们来对照一下utf-8编码规则:如果一个字节的第一位是0
,则这个字节单独就是一个字符;如果第一位是1
,则连续有多少个1
,就表示当前字符占用多少个字节,
Unicode | Utf-8 |
000000-00007F | 0xxxxxxx |
000080-0007FF | 110xxxxx 10xxxxxx |
000800-00FFFF | 1110xxxx 10xxxxxx 10xxxxxx |
010000-10FFFF | 11110xxx10xxxxxx10xxxxxx10xxxxxx |
我们之前得到了“字”的unicode值u5B57, 位于第三行,utf-8编码后的结果是[1110xxxx 10xxxxxx 10xxxxxx]
我们再把unicode值转成2进制结果为101101101010111,从后往前依次替换x,不足部分补0
得到 ②[11100101 10101101 10010111] 正是①输出的结果
二. Unicode 与 UTF-8
Unicode 为每一个字符规定了一个唯一值, 通常标准的字符都位于 \u0000到\uFFFF 65536个值, 当仍可以继续扩充
但是计算机存储通常以字节为单位, 一个字节最多只能记录 0-255, 像“字“的unicode值23383 只能通过多个字节存储
UTF-8 提供的便是如何将一个unicode值转换成多个字节的规则