计算机的世界中,充满了各种编码,编码就是将世界的事物,通过定义的一套数字规范,进而实现其可以在计算机中存储可计算。unicode码存在的目的是为了统一对世界各国各民族的语言文字进行规范的一套编码。
如下图所示
unicode码只是一种编码的规范,它没有定义在计算机中怎么对其存储,在unicode编码规范中,由于unicode编码覆盖面广阔,码值分布在0到2的32次方之间。在计算机中可以使用4byte来存储一个unicode码,但是这样的存储是不有些浪费存储空间,于时就有大神出来解决这个问题,Ken Thompson-unix之父,同时也是go语言之父,参与设计了UFT-8来解决unicode的存储问题。
unicode编码到uft-8之间的转化是怎么规范的呢?
unicode编码 | UTF-8编码 |
---|---|
<code>U+00000000 – U+0000007F </code> | <code>0xxxxxxx</code> |
<code>U+00000080 – U+000007FF </code> | <code>110xxxxx 10xxxxxx |
</code>|
| <code>U+00000800 – U+0000FFFF </code> | <code>1110xxxx 10xxxxxx 10xxxxxx
</code>|
| <code>U+00010000 – U+001FFFFF </code> | <code>11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
</code> |
| <code>U+00200000 – U+03FFFFFF </code>| <code>111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
</code> |
| <code>U+04000000 – U+7FFFFFFF </code>| <code>1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
</code> |
将unicode码的二进制按从右到左的顺序依次填入x位置,就可完成uft-8的转码。
如:我们现在要将中文的"你好“转化为utf-8编码进行存储,在此我们不要使用编程语言来实现,通过手动的方式一步一步的完成转化
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编码之间的区别及转化算法了吧。
原创声明,本文系作者授权云+社区发表,未经许可,不得转载。
如有侵权,请联系 yunjia_community@tencent.com 删除。
我来说两句