Unicode 与 UTF-8

Unicode

Unicode 是一种统一码,统一了世界上各种文字编码.这里我可以简单的把 Unicode 理解为一张表,表里为数字对应的文字.

10 进制 16 进制 字符
77 0x004D M
78 0x004E N
19969 0x4E01
36229 0x8D85

UTF-8

UTF-8 就是 Unicode 的一种实现方式,UTF-8 最长是四个字节,为什么说最长,因为它是变长的,比如我们要表达字符 A 就使用一个字节就可以了,如果我们要表达就需要三个字节.从这点看来 UTF-8 是利于传输的,把 UTF-8 编码变为字符只需要把 UTF-8 按照一定规则转换为 Unicode 码即可找出对应的字符.

UTF-8 编码的规则 (其中x代表可用的编码位)

字节数 编码方式(二进制表达比较清晰)
一个字节的情况 0xxxxxxx
两个字节的情况 110xxxxx 10xxxxxx
三个字节的情况 1110xxxx 10xxxxxx 10xxxxxx
四个字节的情况 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

UTF-8 转 Unicode

UTF-8 编码获取字符 :

UTF-8 编码的二进制为 11100100 10111000 10000001,通过上边的 编码规则 可知这是三个字节的编码,取可用的编码位 x 可以得到的 Unicode 码为 00100 111000 000001 ,转换为十进制为 19969 ,通过 Unicode 表可知对应的字符为

UTF-8 编码获取字符N :

NUTF-8 编码的二进制为 01001110,通过上边的 编码规则 可知这是一个字节的编码,取可用的编码位 x 可以得到的 Unicode 码为 1001110 ,转换为十进制为 78 ,通过 Unicode 表可知对应的字符为 N

在 go 中获取字符串的 UTF-8 编码字节:

func main() {
    s := "丁"
    fmt.Printf("%b\n", []byte(s)) // 11100100 10111000 10000001
    s = "N"                                                    
    fmt.Printf("%b\n", []byte(s)) // 01001110
}