专栏首页云端漫步深入理解unicode编码和utf-8编码区别
原创

深入理解unicode编码和utf-8编码区别

编码算法总结

计算机的世界中,充满了各种编码,编码就是将世界的事物,通过定义的一套数字规范,进而实现其可以在计算机中存储可计算。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编码进行存储,在此我们不要使用编程语言来实现,通过手动的方式一步一步的完成转化

  1. 将"你好"转化为unicode码 在http://www.chi2ko.com/tool/CJK.htm网站中,查找"你好"两个汉字对应的unicode码值你 ----> 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编码之间的区别及转化算法了吧。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 深入理解unicode编码和utf-8编码区别

    计算机的世界中,充满了各种编码,编码就是将世界的事物,通过定义的一套数字规范,进而实现其可以在计算机中存储可计算。unicode码存在的目的是为了统一对世界各国...

    暮雨
  • 使用信号进制实现进程通信

    而在应用系统开发中,我们常用的方式就是消息队列和套接字两种方式。在程序中写了一个死循环,运行时,常使用<code>ctrl+c</code>来中断进程。突然软件...

    暮雨
  • GET和POST的区别

    这是百度搜索答案TOP1,通过查阅官方资料。发现答案基本是错的,下面根据答案逐一分析:

    暮雨
  • 干货 | Elasticsearch5.X Mapping万能模板

    0、引言 在关系型数据库如Mysql中,设计库表需要注意的是: 1)需要几个表; 2)每个表有哪些字段; 3)表的主键及外键的设定——便于有效关联。 表的设计遵...

    铭毅天下
  • 在UBUNTU虚拟机上安装R软件包

    拓端
  • pytest封神之路第七步 用例查找原理

    当执行pytest命令时,pytest会从project中查找test来执行。本文先从几个路径相关的概念讲起,这样便于理解pytest在遍历路径时的走向。

    dongfanger
  • PAT (Basic Level) Practice (中文)1047 编程团体赛 (20 分)

    编程团体赛的规则为:每个参赛队由若干队员组成;所有队员独立比赛;参赛队的成绩为所有队员的成绩和;成绩最高的队获胜。

    glm233
  • Go语言 | Go 1.9 新特性 Type Alias详解

    北京时间2017.08.25,Go1.9正式版发布了。Go1.9经历了2个beta,好几个月,终于定了,发布了正式版本。Go 1.9包含了很多改变,比如类型别名...

    飞雪无情
  • Node.js v13.3.0(Current)发布

    Node.js v13.3.0(Current)于 2019-12-03 发布,以下为一些显著的的变化。Node.js 版本不清楚的可以参考 Node.js 版...

    五月君
  • 一站式体验腾讯云音视频及融合通信技术

    对于一款音视频产品,从底层编解码、到传输网络、到平台架构、再到用户终端,无一不决定产品“生死”,与此同时,伴随用户数量的提升和对观看体验的不断提高,如何融合AI...

    LiveVideoStack

扫码关注云+社区

领取腾讯云代金券