计算机的世界中,充满了各种编码,编码就是将世界的事物,通过定义的一套数字规范,进而实现其可以在计算机中存储可计算。unicode码存在的目的是为了统一对世界各国各民族的语言文字进行规范的一套编码。如下图所示
unicode码只是一种编码的规范,它没有定义在计算机中怎么对其存储,在unicode编码规范中,由于unicode编码覆盖面广阔,码值分布在0到2的32次方之间。在计算机中可以使用4byte来存储一个unicode码,但是这样的存储是不有些浪费存储空间,于是就有大神出来解决这个问题,Ken Thompson-unix之父,同时也是go语言之父,参与设计了UFT-8来解决unicode的存储问题。unicode编码到uft-8之间的转化是怎么规范的呢?
0xxxxxxx
将unicode码的二进制按从右到左的顺序依次填入x位置,就可完成uft-8的转码。
如:我们现在要将中文的"你好“转化为utf-8编码进行存储,在此我们不要使用编程语言来实现,通过手动的方式一步一步的完成转化
你 ----> 4F60
好 ----> 597D
通过同上表中的转化规则比较,符合第三行转化规则,即1110xxxx 10xxxxxx 10xxxxxx
unicode转二进制通过命令行工具bc进行转化
~ bc
bc 1.06
Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
obase=2
ibase=16
4F60
100111101100000
597D
101100101111101
转化实现
100 111101 100000 ----> 11100100 10111101 10100000(你)
101 100101 111101 ----> 11100101 10100101 10111101(好)
验证
package main
import (
"fmt"
)
func main() {
var aa = "你好"
for i := 0; i < len(aa); i++ {
fmt.Printf("%b ", aa[i])
if (i+1)%3 == 0 {
fmt.Println()
}
}
}
$go run demo.go
11100100 10111101 10100000
11100101 10100101 10111101
同我们手动转化的结果相同。
通过以上的实验操作,你应该全面的理解了unicode编码和utf-8编码之间的区别及转化算法了吧。